如何从基对象的派生类访问函数
Posted
技术标签:
【中文标题】如何从基对象的派生类访问函数【英文标题】:How to access a function from a derived class from a base object 【发布时间】:2021-03-10 21:15:15 【问题描述】:我有一个带有对象的向量数组,我用一些相同的对象填充了它,但我也用一些从基础对象派生的对象填充了它。但我无法访问数组中派生对象的函数。是否可以访问它?
vector<BaseObject*> objects;
if (type == 1)
objects.push_back(new DerivedObject(var1, var2, var3));
else
objects.push_back(new BaseObject(var1, var2));
objects[index]->GetFunctionOnDerivedClass(); // How to do this
【问题讨论】:
通常,当您有类似vector<BaseObject*> objects
的内容时,这是因为您希望它包含继承自BaseObject
的各种类型的对象。如果所有这些派生类型都应该有GetFunctionOnDerivedClass()
,那么它应该是BaseObject
的virtual
成员。否则,您必须决定当您尝试在不是DerivedObject
类型的对象上调用GetFunctionOnDerivedClass()
时会发生什么。如果objects
只包含DerivedObject
对象,那么它应该有指向该类型的指针。
BaseObject*
被称为原始指针,如果没有明确必要,应避免使用,因为原始指针有很大的潜力产生不需要或未定义的行为。你可能想看看smart-pointers
如果所有权是一个问题,应该避免使用原始指针,而不是理所当然的。智能指针也不是万无一失的解决方案;他们有自己的警告。
【参考方案1】:
下面的例子演示了如何使用基本的多态性:
#include <iostream>
#include <vector>
class BaseObject
public:
int var1;
int var2;
BaseObject(int var1, int var2) : var1var1, var2var2
virtual void print() const
std::cout << "BaseObjectvar1=" << var1 << ",var2=" << var2 << "\n";
;
class DerivedObject : public BaseObject
public:
int var3;
DerivedObject(int var1, int var2, int var3) : BaseObject(var1,var2), var3var3
void print() const
std::cout << "DerivedObjectvar1=" << var1 << ",var2=" << var2 << ",var3=" << var3 << "\n";
;
int main()
constexpr int var1 = 1;
constexpr int var2 = 2;
constexpr int var3 = 3;
std::vector<BaseObject*> objects;
objects.push_back(new DerivedObject(var1, var2, var3));
objects.push_back(new BaseObject(var1, var2));
objects[0]->print();
objects[1]->print();
将作为输出给出
DerivedObjectvar1=1,var2=2,var3=3
BaseObjectvar1=1,var2=2
See Example in CompilerExplorer See Example using smart-pointer in CompilerExplorer
【讨论】:
【参考方案2】:要访问私有成员数据,只需将派生类或成员函数声明为基类的友元。更多信息请看这里:https://en.cppreference.com/w/cpp/language/friend
【讨论】:
问题是无法访问。objects[index]
是指向基类型的指针。他们希望通过该指针访问对象的派生部分。
如果访问是问题,还有更简洁的方法。以上是关于如何从基对象的派生类访问函数的主要内容,如果未能解决你的问题,请参考以下文章