如何从基对象的派生类访问函数

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&lt;BaseObject*&gt; objects 的内容时,这是因为您希望它包含继承自BaseObject 的各种类型的对象。如果所有这些派生类型都应该有GetFunctionOnDerivedClass(),那么它应该是BaseObjectvirtual 成员。否则,您必须决定当您尝试在不是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] 是指向基类型的指针。他们希望通过该指针访问对象的派生部分。 如果访问是问题,还有更简洁的方法。

以上是关于如何从基对象的派生类访问函数的主要内容,如果未能解决你的问题,请参考以下文章

如何从基类 C++ 访问派生数据

从基类函数派生的类容器

如何从基类调用派生类函数?

如何使 Python 模拟从基类派生?

如何通过派生类函数从基类更改向量

从基类类型的向量访问派生类方法