我有三个不同的基类:
class BaseA
{
public:
virtual int foo() = 0;
};
class BaseB
{
public:
virtual int foo() { return 42; }
};
class BaseC
{
public:
int foo() { return 42; }
};
然后,我像这样从基派生(用X代替A、B或C):
class Child : public BaseX
{
public:
int foo() { return 42; }
};
如何在三个不同的基类中重写该函数?我的三个假设是正确的吗?还有其他的注意事项吗?
发布于 2009-06-22 15:11:52
在派生类中,如果方法在基类中定义为虚拟的,则该方法是虚拟的,即使在派生类的方法中未使用关键字virtual。
对于带有BaseA
的
foo()
是虚拟的,并在带有BaseB
的类Child
.foo()
是虚拟的(),并在类Child
. BaseC
中执行。但是,它将进行编译和执行,但如果您从BaseC
的上下文调用它,它将执行BaseC
版本;如果您使用Child
.
BaseC
>版本发布于 2009-06-22 15:10:00
要记住的重要规则是,一旦一个函数被声明为虚拟的,在派生类中具有匹配签名的函数始终是虚拟的。因此,它被A的孩子和B的孩子覆盖,这两个孩子的行为是相同的(除了你不能直接实例化BaseA)。
然而,在C中,函数不会被覆盖,而是会被重载。在这种情况下,只有静态类型才重要:它将根据指向的指针(静态类型)来调用它,而不是根据对象实际是什么(动态类型)来调用它。
发布于 2009-06-22 15:13:41
使用BaseA时为
,则子类不编译,未定义纯虚函数
只有当您尝试创建BaseA的对象时,才会出现这种情况。如果您创建了Child对象,然后可以使用BaseA*或Child*调用foo()
如果使用BaseB,则在BaseB*或
*上调用foo时,将调用子对象中的函数。
取决于对象的类型,因为对象可以是BaseB或子项。如果对象为BaseB,则调用BaseB::foo。
使用BaseC,在
*上调用foo时,会调用子类中的函数,但不会在BaseB*上调用(调用父类中的函数)。
是的,但你永远不会想这么做的。
https://stackoverflow.com/questions/1027724
复制相似问题