C++:在继承层次结构中的每个类中使用virtual
C++: Use virtual in every class in the inheritance hierarchy?
我有这个代码:
#include <iostream>
using namespace std;
class FooA {
public:
virtual void meth () {cout << "hiAn";}
};
class FooB : public FooA{
public:
void meth () {cout << "hiBn";}
};
class FooC : public FooB {
public:
void meth () {cout << "hiCn";}
};
int main() {
FooA a;
a.meth();
FooB b;
b.meth();
FooC c;
c.meth();
FooA* ptr = &a;
ptr->meth();
ptr = &b;
ptr->meth();
ptr = &c;
ptr->meth();
FooB* ptrB = &b;
ptrB->meth();
ptrB = &c;
ptrB->meth();
}
输出是这样的:
hiA
hiB
hiC
hiA
hiB
hiC
hiB
hiC
该代码是基本的、不言自明的。我尝试了在每个类中使meth()成为虚拟或非虚拟的不同组合。显然,这将改变输出的方式,尤其是在FooA::meth()未声明为虚拟的情况下。我得出的结论是,让该方法的每个实例都是虚拟的可能是最好和最清楚的。有什么理由不这样做吗?
编辑:我还有一个问题。当您声明一个类,然后在类声明之外定义它时,使用:
像这个
class Foo{
public:
virtual void bar();
};
void Foo::bar {
cout << "Hello";
}
为什么我不能做之类的事情
virtual void Foo::bar {
cout << "Hello";
}
有什么理由不这样做吗?
这是多余的。
如果基类中有一个方法声明为virtual
,那么这个虚拟性将被重写方法"继承"。
除此之外,出于文档目的,可能是可以接受的。但是,请记住,最好的虚拟机是private,使用非虚拟接口习惯用法。
这样一来,"用于文档"的理由就落到了实处,因为私有方法不需要公共文档。
是的,当您出于某种原因不希望派生类覆盖meth()的实现时。
如果您认为派生类可能需要更改meth()的实现,请将该方法设为虚拟方法。
相关文章:
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 多重继承:跳过'virtual'关键字并拒绝菱形层次结构的使用?
- 为什么Virtual继承2类会增加对象大小
- 为什么'virtual'继承不是默认行为?
- C++:在继承层次结构中的每个类中使用virtual
- 多重(菱形)继承编译而不"virtual",但不使用
- 什么是从虚拟基类继承的虚函数的"virtual thunk"?
- "Missing non-virtual thunks"和继承顺序