有人可以解释(/指出我)正确的方向或举一个简单的例子。我正在使用API函数,它返回一个TYPE A的指针。我已经扩展了A类,我称之为B. B有一个额外的函数。
如何正确地将TYPE A的API返回指针分配/初始化为B的实例,以便我可以调用我的额外函数。
答案 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
。