【问题标题】:C++ virtual class methodC++虚拟类方法
【发布时间】:2016-10-17 20:16:48
【问题描述】:

想象一下,我有一个 C++ 中的超类 A,它有一个虚方法。如果我想在我的 B 类上覆盖它并仍然保持它是虚拟的,是否建议在 B 类上保留 virtual 关键字我可以忽略它,因为我已经说过该方法在超类上是虚拟的?

例如,执行以下操作的正确方法是什么。

方法一:

class A{ 
    public:
        virtual void hello(){
            std::cout << "Hello World!" << std::endl;
        };
};
class B: public A{
    public:
        virtual void hello() override{
            std::cout << "Hello Sun!" << std::endl;
        };

};
class C: public B{
    public:
        virtual void hello() override{
            std::cout << "Hello Moon!" << std::endl;
        };

};

或者仅在第一个类上将函数声明为虚拟函数。

方法B:

class A{ 
    public:
        virtual void hello(){
            std::cout << "Hello World!" << std::endl;
        };
};
class B: public A{
    public:
        void hello() override{
            std::cout << "Hello Sun!" << std::endl;
        };

};
class C: public B{
    public:
        void hello() override{
            std::cout << "Hello Moon!" << std::endl;
        };

}; 

我想在所有情况下都使用延迟投标。所以我需要 hello() 方法在三个类中是虚拟的。两种方法都适用于 CodeBlocks,但我不知道最好的方法是什么,或者它们之间是否有任何区别。

【问题讨论】:

  • 您不需要保留virtual 关键字。你的代码出了什么问题?
  • @πάνταῥεῖ 嘿,谢谢你的回复。我的代码运行良好我只是不知道实现它的最佳方法是什么(A 或 B)。现在我知道我不需要保留虚拟关键字

标签: c++ class virtual


【解决方案1】:

virtual对于BC是多余的,效果完全一样。重要的是总是用override1 标记你的方法,如果它们打算覆盖一个虚拟方法。虽然这不是绝对必要的,但这是一个很好的做法。你在这两个例子中都做对了。

相关标准:

n4140

§ 10.3 [class.virtual] / 2

如果在类 Base 中声明了一个虚成员函数 vf 并在 一个类Derived,直接或间接派生自Base,一个 同名成员函数vf,参数类型列表, 与Base::vf 相同的cv-qualification 和refqualifier(或没有相同) 被声明了,那么Derived::vf 也是虚拟的(不管是不是 如此声明),它会覆盖Base::vf


1override 作为说明符从 C++11 开始可用。

【讨论】:

  • override c++11 中引入的说明符,因此并不总是可以使用它。
  • @Nikita 查看日历。咳咳。已编辑。
  • 大量 C++ 代码仍在使用旧编译器,在大多数情况下无法升级。
  • @krzaq 在 C++11/14 中,override 的使用不是必需的,但强烈推荐使用它,这样你就不会出错。
  • @vsoftco 已编辑,措辞更符合您的喜好吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-09
  • 2011-09-30
  • 2013-03-08
  • 1970-01-01
  • 2015-06-13
  • 2012-11-30
相关资源
最近更新 更多