[英]Rules for deriving from a non-virtual descendant with virtual base class
如果我有一个 C++ 类的层次结构,其中基类有一个声明为虚拟的成员函数,但派生类不将该函数声明为虚拟的,那么虚拟化在类层次结构中进行了多远。 例如,给定的代码是否明确定义了 MyFunc2 的返回值?
class A
{
public:
virtual int x() { return 1; }
}
class B : public A
{
public:
int x() { return 2; }
};
class C: public B
{
public:
int x() { return 3; }
};
int MyFunc1(f &A)
{
return f.x();
}
int MyFunc2(f &B)
{
return f.x();
}
int MyFunc3()
{
C c;
return MyFunc1(c);
}
int MyFunc4()
{
C c;
return MyFunc2(c);
}
从这里的类似问题来看,一旦它在基类中是虚拟的,虚拟特性就会向前传播到所有类,但我想知道这是如何定义的,特别是 Bx() 虚拟的含义是从一种。
子类中的覆盖也是隐式虚拟的。 您可以再次指定virtual
关键字,但它没有任何区别,尽管它通常被认为是好的做法。 它在标准中绝对是“明确定义的”。
从 C++11 开始,您有一个更好的选择:您可以使用override
标记子类中的虚拟方法,以确保它们实际上覆盖了某些东西。 这可以防止由于较小的原型差异而不实际覆盖父方法,并且如果您更改基本虚拟原型但忘记调整覆盖,则会触发错误。
是的, virtual
特征“传播”(使用您的措辞)到所有派生类。 如果派生类声明并定义了与继承的虚函数具有相同签名的成员函数,则它们会覆盖它。
C++11 引入了final
修饰符,派生类可以使用它来防止其后代进一步覆盖继承的虚函数。 然而,该函数在技术上仍然是虚拟的(例如,给定一个指向 base 的指针, p->func()
的多态调用调用对应于对象实际类型的func()
)......它只是不能被覆盖。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.