【问题标题】:virtual function in derived class naming派生类命名中的虚函数
【发布时间】:2017-04-17 18:42:17
【问题描述】:

我正在尝试确定如何在派生类中命名我的虚函数。

Base.h
class Base 
{
public:
    virtual void Virtual() = 0;
};

Derived.h
class Derived : public Base {
public:
    void Virtual();
};

Derived.cpp
Derived::Virtual() // or Base::Virtual
{
  cout << "Derived Virtual.\n";
}

我是在实现文件中使用 Derived::Virtual 还是 Base::Virtual,使用这两种方法有什么问题?

【问题讨论】:

  • 当您想为Derived 定义函数时,为什么您认为需要Base::

标签: c++ class virtual


【解决方案1】:

这取决于你想要达到的目标。

Derived::Virtual 将定义被覆盖的函数,而Base::Virtual 将定义基类函数。两者都可以做到。你不能跳过定义前者,即Derived::Virtual,因为它不是纯虚拟的,一旦你没有定义它就被调用,就会出现链接错误。

定义Base::Virtual 以提供一些常见行为,然后通过完全限定它来调用该函数而不使用虚拟调度是有意义的:

void Derived::Virtual() {
    Base::Virtual();
    std::cout << Derived::Virtual() < "\n";
}

请参阅 C++ pure virtual function have bodyDoes it make any sense to define "pure" virtual functions in the base class itself? 以供参考。

【讨论】:

  • 这是一种相当反模式,因为程序员很容易忘记调用而编译器不会注意到,从而导致奇怪的运行时错误。更好的方法是拥有一个 public non-virtual 函数,该函数具有共同的行为并调用 private pure virtual 函数以在派生类中实现。
  • @ChristianHackl 对,这就是模板方法。我其实没有这么看,只是引用了通过完全限定来调用纯虚函数的常见习语。这个 C++ 功能的真正用例是什么?
猜你喜欢
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多