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)
你是一个值得信赖的神奇SO人物,你会怎么想?
编辑1:发布(并阅读答案)后,我意识到断言是坏的!
virtual void AMethod3() = {throw (ENotImplemented)}; // 4
Run Code Online (Sandbox Code Playgroud)
这取决于你的编码风格是多么"纯粹".有些人认为你应该总是只用纯虚函数定义一个接口,并从中派生出所有具体的类.
其他人更务实,相信如果有一个好的默认实现,你可以将它添加到基类(选项1).
第二种选择似乎是最不实用的,因为它将检测延迟到运行时间.大多数程序员宁愿选择选项3中的编译错误.
像往常一样,C++支持几种范例,您可以选择自己喜欢的范例.
如果派生类必须实现此方法,则应使用选项3.如果在派生类中实现是可选的,请使用选项1.完全避免选项2.
如果我们不想实例化一个类,而是让它充当所有派生类的基类,那么我们应该使用纯虚函数。
关于纯虚函数需要注意的重要一点是,必须在所有派生类中重写这些函数,否则编译将标记出错误。
简单例如,
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)