可能重复:
C++ : implications of making a method virtual
Why is 'virtual' optional for overridden methods in derived classes?
我想知道,在以下情况中记录的行为是什么:
你有
class A
{
virtual void A()
{
cout << "Virtual A"<<endl;
}
void test_A()
{
A();
}
}
class B: public A
{
void A()
{
cout << "Non-virtual A in derived class"<<endl;
}
void test_B()
{
A();
}
}
A a; B b;
a.test_A();
b.test_A();
b.test_B();
根据C ++标准它应该做什么以及为什么? GCC的工作方式如B :: A也是虚拟的。
在派生类中使用非虚拟方法覆盖虚拟方法时,一般会发生什么?
答案 0 :(得分:3)
如果存在具有相同名称和签名的虚拟基类成员函数,则子类成员函数将隐式虚拟。
答案 1 :(得分:2)
代码不应该编译,因为您不能使用类的名称命名方法。但就我所知,这是你真正的问题:
即使
virtual
关键字不存在,虚拟方法是否会暗示所有派生类中的相同方法是虚拟的?
答案是肯定的。一旦方法在类中声明为虚拟,那么该方法的所有覆盖都将是虚拟的,并且virtual
关键字在派生类中是可选的(即使我建议键入它,如果仅用于文档目的)。请注意,对于派生类中的方法是覆盖,它必须具有相同的名称和签名,只有潜在的差异是协变返回类型:
struct A {};
struct B : A {};
struct base {
virtual A* foo();
virtual A* bar();
};
struct derived : base {
virtual B* foo(); // override, covariant return type
virtual int bar(); // not override, return type is not covariant
virtual A* bar(int); // not override, different argument list
};
答案 2 :(得分:0)
根据标准,它应该是
A a; B b; a.test_A(); //"Virtual A" b.test_A(); //Non-virtual A in derived class b.test_B(); //Non-virtual A in derived class
答案 3 :(得分:0)
此代码格式错误。构造函数不能具有返回类型(就像您对'A'的构造函数所做的那样)。构造函数也不能是虚拟的。
修复A的构造函数后,由于A的构造函数是私有的,因此B类格式不正确。
因此,此代码存在许多问题(包括在类定义中缺少分号)。