将返回的类型分配给derrived类型

时间:2017-06-27 09:30:38

标签: c++

有人可以解释(/指出我)正确的方向或举一个简单的例子。我正在使用API​​函数,它返回一个TYPE A的指针。我已经扩展了A类,我称之为B. B有一个额外的函数。

如何正确地将TYPE A的API返回指针分配/初始化为B的实例,以便我可以调用我的额外函数。

3 个答案:

答案 0 :(得分:4)

大多数人采用的方法不是扩展A来添加成员函数,而是简单地添加一个带有A&类型参数的新常规函数。当您需要访问类的内部时,成员函数应仅

如果确实需要访问(受保护)成员,可以为B添加一个初始化基类的构造函数:

class B : A {
    B(A a) : A(std::move(a)) {}
}

然后只是

B value = get_the_A();

这要求A可以复制或移动。如果没有,那么这是不可能的。

答案 1 :(得分:1)

您可以为扩展类提供适当的构造函数,该类接受基类并以您希望的方式扩展它。

例如:

struct A {
    A(A& a) : a_(a.a_) {}
    A(int a) : a_(a) {}
    int a() { return a_; }
private:
    int a_;
};
struct B : A {
    B(A a) : A(a), b_(100) {}
    int b() { return b_; }
private:
    int b_;
};

A* thirdPartyFcn() {
    return new A(97);
}

int main()
{
    B b(*thirdPartyFcn());
    std::cout << b.a() << std::endl;
    std::cout << b.b() << std::endl;
}

注意,它期望基类具有复制构造函数。

答案 2 :(得分:0)

如果您的新功能不是虚拟功能,那么只需static_cast<B *>(functioncall())即可。它是未定义的行为,但它应该适用于所有编译器。我不推荐这种方法。仅当您需要访问A的内部,并且您没有任何其他解决方案时才使用此方法。

我建议添加一个简单的独立函数,该函数将A *作为参数,而不是扩展A