将抽象参数传递给方法,为什么不呢
Pass abstract parameter to method, why not?
我已经编写了一个抽象类(使用纯虚拟函数),我希望有一个方法接受一个这样的类作为参数。既然这个类是抽象的,我知道我不能把抽象类传递给任何方法,但为什么我不能把一个抽象类的子类传递给那个方法呢?如何指定参数应该是指定基类的任何子类?这一切都在C++中。
您需要将参数指定为指针(或引用),例如Abstract *
而不是Abstract
。如果Derived
继承自Abstract
,则当应为Abstract *
时,可以传递类型为Derived *
的变量,但当应为Abstract
时,通常不能传递类型为Derived
的变量。
然后在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
}
您确实可以做到这一点,请观察:
纯抽象类:
class Abstract {
public:
virtual void foo() = 0;
};
覆盖成员函数的子函数:
class AbstractImpl : public Abstract {
public:
void foo() override { std::cout << "Hi from subclassn"; }
};
现在我们声明一个方法,该方法采用抽象类的引用类型
void somefunc(Abstract &ab) {
ab.foo();
}
最后,我们主要实例化子类参数
int main() {
AbstractImpl test;
somefunc(test); // prints Hi from subclass
return 0;
}
来源:https://stackoverflow.com/a/11422101/2089675
相关文章:
- 通过构造函数方法输出的类到类类型转换是 5500 为什么不是 5555
- 为什么当其他类别存在时,为什么不从其对象文件中使用一种类方法
- 为什么不允许虚方法返回 void 指针
- 为什么不能在 lambda 中使用私有方法
- 将抽象参数传递给方法,为什么不呢
- 为什么 const 方法不覆盖 C++ 中的非 const 方法?
- 为什么不调用这个 Ruby 覆盖方法
- 为什么不能使用与成员类型同名的方法?
- 如果存在非常量限定的私有方法,为什么不能在非常量对象上调用常量限定的方法
- 为什么比较方法不起作用?
- 为什么OpenGL方法不返回任何内容
- 在c++中定义类中的方法时,为什么不存在多个定义错误呢
- 为什么调用方法1而不是方法2
- 为什么类方法不能调用同名的全局函数?
- 多重虚拟继承:为什么类方法不模棱两可?
- 为什么TMutex方法Acquire()不锁定互斥对象?
- 为什么不调用子类方法?
- 为什么这些方法调用不明确
- 为什么 QFileDiaglog 方法目录不显示当前目录?
- 为什么Java方法中不允许使用静态变量,就像在C/C++函数中一样