具有 3 级继承的基类shared_ptr的多态性
Polymorphism with shared_ptr of base class with 3 level inheritance
>我有一个基类
class Base {
public:
virtual void func() = 0;
}
我有一个具体的派生类
class Derived : public Base {
public:
void func() {func2();}
void func2() {};
}
最后,我有一个派生类
class DerivedDerived : public Derived {
// inherits func() from Derived
void func2() {} //Overrides func2() from Derived
}
void g(shared_ptr<Base> s) {
s->func();
}
现在,我的问题是这样的:我有一个函数 g((,它接受一个 shared_ptr
shared_ptr<Base> s1 = make_shared<Derived>();
shared_ptr<Base> s2 = make_shared<DerivedDerived>();
g(s1); //func() of Derived Class called
g(s2); //func2() of Derived Class called inside, func2() of DerivedDerived Class needed to be called inside.
我希望 func(( 调用正确类的 func2((,即
作为本主题的补充,由于 C++11 存在override
关键字,因此可以防止此类错误。使用它时,如果未重写使用该关键字的方法,则会引发编译器错误。
class DerivedDerived : public Derived {
void func2() {} override; // would throw an error in your case
}
好的,因为您已经更改了代码 - 正如 Jarod42 所提到的,我正在更新结果 - 您正在隐藏 func2 而不是覆盖它。我还根据亚历山大的建议添加了覆盖关键字。
#include <iostream>
#include <memory>
class Base {
public:
virtual void func() = 0;
};
class Derived : public Base {
public:
void func() override {func2();}
virtual void func2() {std::cout << "func2: Derivedn";};
}
;
class DerivedDerived : public Derived {
public:
void func2() override {std::cout << "func2: DerivedDerivedn";} //Overrides func() from Derived
};
void g(std::shared_ptr<Base> s) {
s->func();
}
int main()
{
std::shared_ptr<Base> s1 = std::make_shared<Derived>();
std::shared_ptr<Base> s2 = std::make_shared<DerivedDerived>();
g(s1); //func() of Derived Class called
g(s2); //func() of Derived Class called, func() of DerivedDerived Class needed to
return 0;
}
/***************
Output:
$ ./test
func2: Derived
func2: DerivedDerived
***************/
/* Compiler error when override is used and func2 is not marked virtual
src/test.cpp:19:16: error: ‘void DerivedDerived::func2()’ marked ‘override’, but does not override
void func2() override {std::cout << "func2: DerivedDerivedn";} //Overrides func() from Derived
*/
相关文章:
- 多态性和功能结合
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- C++boost序列化多态性问题
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 如何在多线程中正确使用unique_ptr进行多态性?
- 具有智能指针的多态性
- 在 C++ 中在堆栈上创建实例时如何保持多态性?
- 继承/多态性 - 我是否被迫使用"protected"变量?
- C++ 多态性在代码::块 17.12 中不起作用
- C++ 泛型和多态性:这种模式可行吗?
- 为什么我们实际上需要运行时多态性?
- 如何在这个简单的最小示例中实现多态性?
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 无法初始化已知大小的矢量指针,该大小不会因多态性而更改
- 运行时多态性和dynamic_cast需要澄清
- 如何调用指针类型的方法(禁用多态性)?
- 从基类调用函数的多态性
- c++在没有虚拟析构函数的多态性中共享ptr
- ptr和多态性