Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中强制转换和使用新类的不同重写方法+;_C++_Class_Casting - Fatal编程技术网

C++ 在C+中强制转换和使用新类的不同重写方法+;

C++ 在C+中强制转换和使用新类的不同重写方法+;,c++,class,casting,C++,Class,Casting,我有两个从抽象基类派生的类。每个派生类都有各自的实现,这些实现重写基类中的虚函数func()。我创建了一个名为“a”的derivedClass1对象,并从中运行func() 这将创建一个名为teleporter的derivedClass1对象,其内存地址被强制转换为名为teleported的derivedClass2对象。接下来,我从teleported运行func(),这是derivedClass2的一个对象,但这不起作用,它只是在一个无休止的递归循环中运行derivedClass1中的fun

我有两个从抽象基类派生的类。每个派生类都有各自的实现,这些实现重写基类中的虚函数func()。我创建了一个名为“a”的derivedClass1对象,并从中运行func()

这将创建一个名为teleporter的derivedClass1对象,其内存地址被强制转换为名为teleported的derivedClass2对象。接下来,我从teleported运行func(),这是derivedClass2的一个对象,但这不起作用,它只是在一个无休止的递归循环中运行derivedClass1中的func()

这是一种简化,事实上我在代码中使用了它,其中derivedClass1 teleporter包含某些值(从基类继承并与派生类1和派生类2共享),我希望传递给另一个派生类。这是因为我希望使用相同的对象访问其他类的函数。我知道,我可以简单地创建一个新对象,然后分别复制每个值,但这是一个相当大的程序,所以如果可能的话,我不想全部更改它。如果可以访问typecasted类的重写方法而不是旧方法

using namespace std;

class baseClass {
protected:
public:
    virtual void func() = 0;

};

class derivedClass2 : public baseClass {
public:
    void func() override {
        cout << "Derivation 2 running.\n";
    }
};

class derivedClass1 : public baseClass {
public:
    void func() {
        cout << "Derivation 1 running.\n";
        derivedClass1 teleporter;
        derivedClass2* teleported = (derivedClass2*)(&teleporter);
        teleported->func();
    }
};

int main() {
    derivedClass1 a;
    a.func();
    return 0;
}
预期结果:

Derivation 1 is running.
Derivation 2 is running.
更新:
正如我所说的,我使用的是旧的C型铸造,我尝试了C++风格的铸造。静态\u cast和常量\u cast未运行,动态\u cast在转换失败时给出了nullptr,重新解释\u cast给出了与C类型转换相同的结果。

解除对远传的
的引用会导致未定义的行为,因为它仍然指向
derivedClass1
(derivedClass2*)(&teleporter)的实例——你使用的是C风格的演员,如果你使用C++风格的演员,你会失去所有的自动错误检查。你为什么不写它?teleporter.func()?不需要涉及施法。@Terrornado--LOL。这正是这些施法的目的--给你一个错误,让你知道你在做什么是危险的。使用C风格的演员阵容,你基本上可以将任何类型的演员阵容转换为任何类型的演员阵容——这就是玩炸药,你把自己搞砸了。@Terrornado这是因为我想用同一个对象访问其他类的函数——如果你认为这是你必须做的,你真的需要后退一步,看看你的设计。解除对
远程传输的
的引用会导致未定义的行为,因为它仍然指向<代码>派生类1>代码>代码(派生类2*)(和TelePrter)< /C> > -您使用的是C样式的CAST,如果使用C++样式转换,则会丢失所有自动错误检查。为什么不编写它?teleporter.func()?不需要涉及施法。@Terrornado--LOL。这正是这些施法的目的--给你一个错误,让你知道你在做什么是危险的。使用C样式转换,您基本上可以将任何类型转换为任何类型--这是在玩dynamite,您会自暴自弃。@Terrornado这是因为我希望使用相同的对象访问其他类的函数--如果您认为必须这样做,您真的需要后退一步,看看您的设计。
Derivation 1 is running.
Derivation 2 is running.