什么时候虚拟方法应该是纯粹的?

Ian*_*han 9 c++ methods derived-class pure-virtual

我找到了一些我正在研究的代码,并且想知道最好的设计实现是什么.

如果基类将方法定义为虚拟,但也实现了一个空体,因此不需要派生类实现一个体,那么它是不是应该变为纯粹的呢?

virtual void AMethod1() {}                 // 1
virtual void AMethod2() {assert(false);}   // 2
virtual void AMethod3() = 0;               // 3
Run Code Online (Sandbox Code Playgroud)
  1. 目前的代码.
  2. Idea1:警告用户此派生对象尚未实现此方法体.
  3. Idea2:强制派生类来实现一个体,空或不.

你是一个值得信赖的神奇SO人物,你会怎么想?


编辑1:发布(并阅读答案)后,我意识到断言是坏的!

virtual void AMethod3() = {throw (ENotImplemented)};               // 4
Run Code Online (Sandbox Code Playgroud)

Bo *_*son 9

这取决于你的编码风格是多么"纯粹".有些人认为你应该总是只用纯虚函数定义一个接口,并从中派生出所有具体的类.

其他人更务实,相信如果有一个好的默认实现,你可以将它添加到基类(选项1).

第二种选择似乎是最不实用的,因为它将检测延迟到运行时间.大多数程序员宁愿选择选项3中的编译错误.

像往常一样,C++支持几种范例,您可以选择自己喜欢的范例.


Chr*_*den 6

如果派生类必须实现此方法,则应使用选项3.如果在派生类中实现是可选的,请使用选项1.完全避免选项2.

  • @Ian:我真的不认为这是编码风格的问题,而是更多的语义:确实有默认实现吗?实例化类是否有意义?如果没有覆盖,我是否希望隐式使用默认实现,或者如果想要使用派生类隐式调用它,我是否应该这样做?(嗯,最后一个问题可能只是风格问题).实际上没有*preffered*设计,因为它们没有实现相同的目标:选择一个或另一个取决于您的要求. (4认同)

sgo*_*les 1

如果我们不想实例化一个类,而是让它充当所有派生类的基类,那么我们应该使用纯虚函数。

关于纯虚函数需要注意的重要一点是,必须在所有派生类中重写这些函数,否则编译将标记出错误。

简单例如,

class alpha     {
     public:virtual void show()=0; //pure virtual function
    };

class beta : public alpha {

     public:void show()   //overriding
        {
         cout<<"OOP in C++";
        }
    };
void main() {
     alpha *p;
     beta b;
     p=&b;
     p->show();
   }
Run Code Online (Sandbox Code Playgroud)