使用受保护的方法而不是为继承树中的每个派生类创建新的虚拟函数,这是一种好的做法吗.例如,在描述中
Is it good practice to use protected method instead of create new virtual function for each derived class in inheritance tree. E.g. in descritption
例如,我有三级继承树,我需要在所有级别实现虚拟函数。哪种方式更好?
class Base {
public:
void foo() {
//do something
dFoo();
}
private:
virtual void dFoo() = 0;
}
class DBase: public Base {
private:
void dFoo() {
//do something
ddFoo()
}
virtual void ddFoo() = 0;
}
class DDBase(): public DBase {
private:
void ddFoo() {
//do something
}
}
或
class Base {
public:
virtual void dFoo() { foo(); }
protected:
void foo() { //do something }
}
clase DBase: public Base {
public:
virtual void dFoo() {
Base::foo();
foo();
}
protected:
void foo() { //do something }
}
clase DDBase: public DBase {
public:
virtual void dFoo() {
Base::foo();
DBase::foo();
foo();
}
protected:
void foo() { //do something }
}
我更喜欢第二种方式,但我读到受保护的方法是不好的做法。
Herb Sutter有一篇很好的文章《Virtuality》,你可能会觉得很有启发性。它建议将公共接口与派生类实现的行为分开(实现细节):使公共函数非虚拟,使虚拟函数非公共。
此设计用于std::basic_streambuf。
我认为这与解决方案看起来更好无关。这是关于你想要定义的接口。
由于非虚拟接口(nvi),第一种设计可能更稳定。
如果你限制了对虚拟函数的访问(例如,不公开它们),那么改变实现就更容易了,而不需要每个用户都更改代码并重新编译。
(Herb sutter有一篇关于这个话题的好文章:http://www.gotw.ca/publications/mill18.htm)
class Base {
public:
void foo () {
vfoo();}
protected:
virtual void vfoo() {
// do something
}};
class DBase : public Base {
protected:
virtual void vfoo () {
Base::vfoo();
// do something
}};
class DDBase : public DBase {
protected:
virtual void vfoo () {
DBase::vfoo();
// do something
}};
int main () {
DDBase x;
Base& r = x;
r.foo();
return 0;}
相关文章:
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 有没有一种方法可以在编译时获得作用域类名
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 一种在C++中读取TXT配置文件的简单方法
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 在调用接收数组的方法时,模板化数组大小是不是一种糟糕的做法
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 将错误返回给调用方而不是立即在 C++ 中抛出错误是否是一种好的做法
- 在 c++ 中,有一种方法可以创建一个包含地图作为值的树状地图?
- 有没有一种优雅而快速的方法来测试整数中的 1 位是否位于连续区域
- 在运行时检查继承是否只有一种类型和 void*
- 是否有一种模式来描述哪个对象控制另一个对象的生命周期?
- c++ /SIFT/SQL -如果有一种方法可以有效地比较图像的SIFT描述符与SQL数据库中的SIFT描述符
- XML类描述到c++类描述:一种设计模式
- 使用受保护的方法而不是为继承树中的每个派生类创建新的虚拟函数,这是一种好的做法吗.例如,在描述中