将子类返回到基类对象中
Return child class into base class object
我正试图解决C++中的一些继承问题:
考虑具有方法method()
的基类Foo()
及其派生类Bar
。现在我覆盖Bar
中的方法。
class Foo{
public:
double method();
}
class Bar public: Foo
{
public:
double method()
}
还有这样一个函数:
Foo get_bar(){
Bar bar()
return bar
}
调用函数get_bar()
我希望能够调用Bar::method()
Foo foo = get_bar();
foo.method() (-> which should be Bar::method)
这可能吗?如果,如何?我认为我在这里犯了一个根本性的错误,我没有看到。谢谢
要覆盖(而不是覆盖)一个函数,它必须是虚拟的:
class Foo {
public:
virtual void method();
virtual ~Foo() = default; // technically optional, but usually needed
};
为了完整起见,以下是派生类的正确语法:
class Bar : public Foo {
public:
void method() override; // override is optional, but a good idea
};
多态性只适用于引用和指针,所以函数必须返回其中一个,而不是基类对象。照原样(一旦语法固定),它切片Bar
对象以返回其Foo
的副本,这将不会给您所需的重写函数。
没有可返回引用的现有对象;因此,您可能需要动态地创建一个返回指针。除非您喜欢长时间的调试会话,否则请使用智能指针来管理动态对象:
std::unique_ptr<Foo> get_bar() {
return std::unique_ptr<Foo>(new Bar); // C++14: make_unique<Bar>();
}
如果我正确理解你的问题,你希望get_bar()
返回一个子类Bar
,就像它是基类Foo
一样,这样你就可以在它上面调用method
,它也会调用Bar::method()
。是的,你可以做到。它被称为多态性。
为了实现这一点,get_bar()
需要返回一个指针,否则您将遇到切片问题,并且无法获得您想要的多态行为。由于get_bar()
是一个将所有权转移给调用者的工厂函数,因此最好返回像unique_ptr
或shared_ptr
:这样的智能指针
std::unique_ptr<Foo> getBar() {
return std::make_unique<Bar>();
}
Foo::method()
需要是virtual
才能在Bar
中覆盖它。为了在删除Foo
指针时正确销毁Bar
,Foo
必须有一个虚拟析构函数:
class Foo {
public:
virtual void method();
virtual ~Foo(){}
};
class Bar : public Foo {
public:
void method() override;
};
相关文章:
- 使用基类指针创建对象时,缺少派生类析构函数
- 为什么此派生对象无法访问基类的后递减方法?
- 使用对象的基类部分模板专用化对对象进行哈希处理::哈希
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 获取我的基类以递增派生类对象整数
- 按基类对象访问派生类资源时出错
- 将基类分配给派生对象,反之亦然,以C++以及静态和动态对象之间的差异
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 将派生类的对象传递给基类
- 如何使用函数(而不是构造函数)将派生类对象分配给基类指针
- C++ 构造函数传递对基类对象的引用
- 如何使用数据成员填充派生类的对象到基类的指针数组中
- 创建基类指针的向量并将派生类对象传递给它(多态性)
- 使用基类对象访问派生的仅类方法
- 如何在 c++ 中通过基类引用访问派生类的对象?
- 在基类中创建派生类的对象
- C++:如何将对象作为模板基类传递给函数
- 如何删除派生类中基类对象的新对象
- 使用基类对象调用Dervied Class函数
- 通过指向派生对象基类的指针删除派生对象