c++继承虚拟函数
c++ inherit virtual functions
好吧,假设我们有以下类
class A
{
public:
virtual void taco()
{
cout << "Class A" << endl;
}
};
class B: public A
{
public:
virtual void taco()
{
cout << "Class B" << endl;
}
};
class C : public A
{
public:
void taco()
{
cout << "Class C" << endl;
}
};
现在如果我做这个
A a = A();
B b = B();
C c = C();
a.taco(); //Class A
b.taco(); //Class B
c.taco(); //Class C
deque<A> aa = deque<A>();
aa.push_back(a);
aa.push_back(b);
aa.push_back(c);
for(int i=0;i<aa.size();i++)
aa[i].taco();//All Class A
A r = B();
r.taco(); //Class A
现在你会注意到,当我将A初始化为B或C时,它不会从B或C激发函数。我想知道是否有办法解决这个问题?我理解这样一个概念,即由于对象是A,它使用了A的taco函数,但我只是想知道是否有一些技巧可以使用其他函数。我的项目相当复杂,我不知道所有将覆盖A的类(由于插件覆盖了一个类)。此外,我需要让基本的虚拟函数有一个主体来添加默认行为。谢谢
必须将指针存储在deque
中,因为多态性只适用于引用&指针类型。当您将这些对象插入到deque
中时,副本的类型为A
,"切片"掉最初使其成为B
或C
的部分。
类似地,A r = B()
只是创建一个临时B
,并将其中的A
部分复制到一个名为r
的A
中。
BTW by A a = A();
你还不如写A a;
。它们并不完全等效,但它们在这里起到了相同的作用,你可能是指更简单的版本。
A a;
B b;
C c;
a.taco(); //Class A
b.taco(); //Class B
c.taco(); //Class C
// With pointers and containers
deque<A*> aa;
aa.push_back(&a);
aa.push_back(&b);
aa.push_back(&c);
for (int i=0; i<aa.size(); i++)
aa[i]->taco(); // Hurray!
// With refs
B q;
A& r = q;
r.taco(); // Class B!
(请记住,这些对象a
、b
和c
具有自动存储持续时间。一旦它们超出范围,如果deque
仍然存在,则其所有元素都是无效指针。您可能希望使用动态分配来进一步控制A
、B
和C
对象的生存期。但我将把这留给读者练习。)
相关文章:
- C++无法定义虚拟函数 OUTER 类和头文件
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 当覆盖存在时调用基本虚拟"binded to object"函数
- 如何在C++中伪造虚拟可变参数函数模板?
- 类型擦除的std::function与虚拟函数调用的开销
- 重写虚拟函数和继承
- 是否可以使用函数指针调用虚拟析构函数?
- 在没有动态内存的世界中,我是否需要虚拟析构函数?
- 虚拟继承基构造函数消除
- "虚拟""覆盖"析构函数
- 类中的虚拟布尔函数参数不起作用
- 用纯虚拟函数兜圈子
- 将C++子类成员函数(虚拟实现)传递给 C 类型函数指针
- 尝试在 QLabel 上绘画失败(无法在没有对象的情况下调用成员函数"虚拟无效 QLabel::p aintEvent(QPaintEvent*)")
- 声明析构函数虚拟就足够了吗?
- 视觉 C++当我们在基类中使函数成为纯虚拟时,那么在子类中再次使相同的函数虚拟的必要性是什么
- 重载函数(虚拟/非虚拟)