class A {
protected:
int foo;
};
class B : public A {
public:
B(int bar) { foo = bar; }
int method() { return foo; }
};
class C {
private:
A baz;
public:
C(A faz) { baz = faz; }
A get() { return baz; }
};
int main(void) {
C boo(B(1));
boo.get().method();
return 0;
}
我有一个基类A
,其中B
是其派生类。类C
需要一个A
,但我已经通过了派生类(B
)来代替。没有警告或错误,无法将B
传递给C
,但在上述情况下,我希望方法可见性为method()
。
我对virtual
不太熟悉,但是我确实尝试将virtual int method() = 0;
添加到A
,这会导致进一步的错误。
考虑添加第二个派生类:
class D : public A {
public:
D(int bar) { foo = bar; }
int method() { return foo+1; }
};
我希望C
可以采用B
或D
,而我最好的假设是采用A
并对其进行处理。
如何以这种方式正确使用多态?
#include <iostream>
class A {
public:
virtual ~A(){}
virtual int method() = 0;
protected:
int foo;
};
class B : public A {
public:
B(int bar) { foo = bar; }
int method() {
std::cout << "Calling method() from B" << std::endl;
return foo; }
};
class C {
private:
A* baz;
public:
C(A* faz) { baz = faz; }
A* get() { return baz; }
};
int main(void) {
A* element = new B(1);
C boo(element);
boo.get()->method();
return 0;
}
它打印“从B调用方法()”。但这是出于演示目的。请考虑使用智能指针。