我已经编写了一个抽象类(使用纯虚函数),并且我希望有一个方法接受一个这样的类作为参数。鉴于该类是抽象的,我理解我无法将抽象类传递给任何方法,但为什么我不能将抽象类的子类传递给该方法?如何指定参数应该是指定基类的任何子类?这都是用C ++编写的。
答案 0 :(得分:3)
您需要将参数指定为指针(或引用),例如Abstract *
而不是Abstract
。如果Derived
继承自Abstract
,则可以在期望Derived *
时传递Abstract *
类型的变量,但通常不能传递Derived
类型的变量当预期Abstract
时。
答案 1 :(得分:1)
然后在C ++中使用多态。
给定任何基类:
struct Base{};
及其子类:
struct SubClassA : public Base(){};
struct SubClassB : public Base(){};
如果您声明:
void MyFunctionReference(Base&){};
void MyFunctionPointer(Base*){};
然后你可以打电话:
{
SubClassA a;
SubClassB b;
MyFunctionReference(a); // by reference
MyFunctionPointer(&b); // by pointer address
}
答案 2 :(得分:0)
你确实可以这样做,观察:
纯抽象类:
class Abstract {
public:
virtual void foo() = 0;
};
覆盖成员函数的子项:
class AbstractImpl : public Abstract {
public:
void foo() override { std::cout << "Hi from subclass\n"; }
};
现在我们声明一个采用抽象类的引用类型的方法
void somefunc(Abstract &ab) {
ab.foo();
}
最后在main中我们实例化子类参数
int main() {
AbstractImpl test;
somefunc(test); // prints Hi from subclass
return 0;
}