C ++:派生类和虚方法

时间:2010-11-12 11:11:08

标签: c++ inheritance virtual

  

可能重复:
  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也是虚拟的。

在派生类中使用非虚拟方法覆盖虚拟方法时,一般会发生什么?

4 个答案:

答案 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类格式不正确。

因此,此代码存在许多问题(包括在类定义中缺少分号)。