我的程序有问题...我有一个A类,B类和C类继承自A类...它们住在另一个名为Game的类中,如下所示:
class Game {
public:
Game(bool something);
//all the other functions
private:
A a;
}
我是这样做的,因为我事先不知道对象是B类还是C类,所以我声明它像A然后:
Game(bool something) {
if (something) { a = B(); }
else (something) { a = C(); }
}
现在我的问题: 在程序中我问天气'a'是B还是C ...我希望如果它的B,运行的函数不仅仅是B,A和C都没有。但是,当然,编译器不允许我这样做,因为它认为a是一个A类对象。有谁知道如何解决这个问题?
答案 0 :(得分:2)
class Game {
public:
Game(bool something) : a() {};
~Game(){ if(a) delete a; };
// this is only example, and really need to implement 3 or 5 method
// or use std::shared_ptr instead of pointer, more details at
// https://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29
private:
A* a;
}
Game(bool something) {
if (something) { a = new B(); }
else { a = new C(); }
}
B* b= dynamic_cast<B*>(a);
if( b ) b->method_b_only();
C* b= dynamic_cast<C*>(a);
if( c ) c->method_c_only();
手动定义类型的可能的特殊对象名称或ID:
class B : public A {
public:
B() : _name("B") {}
const std::string& name() { return _name; }
private:
std:string _name;
}
B* b = a;
if( "B" == b.name() ) b->method_b_only();
C* C = a;
if( "C" == c.name() ) c->method_c_only();
答案 1 :(得分:0)
实现所需功能的最直接方法是使用指针。即
class Game {
public:
Game(bool something);
private:
A *a;
}
然后,您可以使用new
关键字创建对象。
这允许您拥有您正在寻找的多态结构。还有其他涉及复制构造函数和引用的方法,但不是那么简单易用。