我有两个类,有些方法同名。我是否可以创建第三个类,该类接受来自其他两个类的引用,并在构造函数中将obj变量设置为A或B类型?
class A
{
public:
A();
void f();
};
class B
{
public:
B();
void f();
};
class C
{
public:
C(B&);
C(A&);
??? obj;
};
发布于 2015-06-25 10:35:25
也许您需要一个模板类:
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();
发布于 2015-06-25 10:42:08
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;
}
变体路线
有各种库提供可以安全地保存任意类型的类。
其中的一些例子是:
在使用此类类时,通常需要一些方法将其转换回实际类型,然后再对其进行操作。
发布于 2015-06-25 10:43:08
您可以有一个基类来定义所需的接口。
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;
}
https://stackoverflow.com/questions/31047798
复制相似问题