在哪里可以定义虚拟函数
Where can a virtual function be defined?
我有一个关于C++中虚拟函数的问题,例如,A
是基类,B
继承A
,C
继承B
,我们可以在B
中定义一个虚拟函数,并在C
中重新定义它吗?我的意思是,这个虚拟函数是否应该在类A
中定义,因为A
是所有B
和C
的基类(即B
和C
的根)?
不必是。。。B是a的一个特殊对象,很可能B比a有更多的特征。如果C是派生的,那么从B重写一个没有在a中定义的函数是非常正常的。
示例
- 假设A是一个形式
- 假设B是一个圆。。。圆具有GetDiameter函数,而窗体没有该函数
- 假设C是一个椭圆,尽管椭圆没有实际直径,但GetDiameter函数被覆盖以获得两个直径中"最小"的直径
virtual
可以在类层次结构中的任何位置使用,但该虚拟函数只能在子类中重写(即它不适用于超类)。
struct A {
void funcA();
};
struct B : A {
virtual funcB();
};
struct C : B {
virtual funcB();
};
//....
B* b = new C();
b->funcB(); // calls C's implementation
A* a = new C();
a->funcB(); // fails to compile
是的,一点问题都没有-试试:
class A
{
}
class B : public A
{
public:
virtual void myFunc(): { std::cout << "B here!"; }
}
class C : public B
{
public:
virtual void myFunc(): { std::cout << "No, C here!"; }
}
相关文章:
- C++无法定义虚拟函数 OUTER 类和头文件
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 类型擦除的std::function与虚拟函数调用的开销
- 重写虚拟函数和继承
- 用纯虚拟函数兜圈子
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 禁止子函数调用父级的抽象(或虚拟)函数
- 无法在子类中使用虚拟函数C++
- 无法在派生对象上运行虚拟函数
- 我可以调用从 main() 覆盖的虚拟函数吗?
- 在 C++ 中将函数获取和设置为虚拟函数
- 使用在堆栈上创建的对象调用虚拟函数
- 为什么在这种情况下不调用我的虚拟函数实现?
- 在C++中使虚拟函数私有化
- 模板继承类中的虚拟函数
- 为什么构造函数的虚拟函数调用有时有效,但其他调用却无效
- doxygenc++虚拟函数和实现
- 如何从派生类函数中调用虚拟函数