我有两个类,其中一些方法具有相同的名称。 我可以创建第三个类来接受来自其他两个的ony的引用,并在构造函数中将obj变量设置为A或B类型吗?
class A
{
public:
A();
void f();
};
class B
{
public:
B();
void f();
};
class C
{
public:
C(B&);
C(A&);
??? obj;
};
答案 0 :(得分:5)
也许你想要一个模板类:
template <typename T>
class C
{
T& obj;
public:
explicit C(T& t) : obj(t) {}
void f() { obj.f(); }
};
然后:
A a;
B b;
C<A> c1(a);
C<B> c2(b);
c1.f();
c2.f();
答案 1 :(得分:2)
C ++是一种非常灵活的语言,因此可以为您提供多种选择。每个人都有自己的利弊。
首先想到的是使用多态。 您有两种选择路径:静态或动态多态。
静态多态路线
要使用静态多态(也称为编译时多态),您应该使C
成为模板类:
template <typename T> class C
{
public:
C(T&);
T& obj;
}
动态多态路线
要使用动态(也称为运行时多态),您应该提供一个接口:
class Fer
{
public:
virtual ~Fer() {}
virtual void f() = 0;
}
哪个A
和B
会实施:
class A : public Fer
{
public:
A();
void f() overide;
};
class B : public Fer
{
public:
B();
void f() overide;
};
C
就像这样:
class C
{
public:
C(Fer&);
Fer& obj;
}
变体路线
有各种库提供可以安全保存任意类型的类。
这些的一些例子是:
使用这些类时,通常需要一些方法在操作之前转换回实际类型。
答案 2 :(得分:0)
您可以拥有一个定义所需接口的基类。
class Base
{
public:
Base();
virtual void f();
};
您可以拥有实现该接口的派生类。
class A : public Base
{
public:
A();
virtual void f();
};
class B : public Base
{
public:
B();
virtual void f();
};
类C
然后引用Base
类,实际上可以接受A
或B
类型的对象。
class C
{
private:
Base& base;
public:
C(Base& b) : base(b) {}
};
它可以很容易地使用。
int main()
{
B b;
C c(b);
return 0;
}