【问题标题】:C++: derived classes and virtual methods [duplicate]C ++:派生类和虚拟方法
【发布时间】:2010-11-12 11:11:08
【问题描述】:

可能的重复:
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 一样工作,也是虚拟的。

当您在派生类中用非虚拟方法覆盖虚拟方法时,一般应该发生什么?

【问题讨论】:

标签: c++ inheritance virtual


【解决方案1】:

如果存在具有相同名称和签名的虚拟基类成员函数,则子类成员函数是隐式虚拟的。

【讨论】:

  • @Downvoter:请解释一下,我想学习。
  • 您需要更仔细地查看代码。顺便说一句,我还没有投票。
  • 代码不起作用,我看到了,但我回答了最后一行中提出的问题。对此,我的回答是正确的。
  • 我明白了。我赞成制衡。顺便说一句,在 C++ 中使用 member function 代替 method。 C++ 和 Java 是不同的。
【解决方案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
};

【讨论】:

  • 是的:我想是的。问题的最后一部分正是如此。 +1
【解决方案3】:

此代码格式错误。构造函数不能有返回类型(就像你对'A'的构造函数所做的那样)。构造函数也不能是虚拟的。

修复A的构造函数后,类B是病态的,因为A的构造函数是私有的。

所以,这段代码有很多问题(包括在类定义中缺少分号)。

【讨论】:

    【解决方案4】:

    按照标准应该是

    一个;乙乙; a.test_A(); //“虚拟A” b.test_A(); //派生类中的非虚A b.test_B(); //派生类中的非虚A

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-04
      • 1970-01-01
      相关资源
      最近更新 更多