在C++中,如果你有一个函数a,其参数是类型为class V的对象,而class Z是class V的子类,那么你可以将Z类的对象作为参数传递给函数a。这是多态性(Polymorphism)在C++中的一个重要体现,特别是通过基类指针或引用实现的多态。
这里有两种主要的方式可以实现这一点:
通过基类引用传递:
如果函数a的参数是V的引用(V&)或常量引用(const V&),那么你可以传递Z的对象给这个函数,因为Z是V的子类。
cpp
复制
class V {
public:
virtual void show() { std::cout << "V show" << std::endl; }
};
class Z : public V {
public:
void show() override { std::cout << "Z show" << std::endl; }
};
void a(V& v) {
v.show();
}
int main() {
Z z;
a(z); // 正确,调用Z的show方法
return 0;
}
通过基类指针传递:
如果函数a的参数是V*(指向V的指针),那么你可以传递指向Z的对象的指针给这个函数。这同样利用了多态性。
cpp
复制
class V {
public:
virtual void show() { std::cout << "V show" << std::endl; }
virtual ~V() {} // 虚析构函数,确保通过基类指针删除派生类对象时正确调用析构函数
};
class Z : public V {
public:
void show() override { std::cout << "Z show" << std::endl; }
};
void a(V* v) {
if (v != nullptr) {
v->show();
}
}
int main() {
Z z;
a(&z); // 正确,调用Z的show方法
return 0;
}
在这两种情况下,由于show方法是虚函数,所以调用的是Z类中定义的show方法,而不是V类中的。这是多态性的核心:通过基类类型的引用或指针调用虚函数时,会根据对象的实际类型(即运行时类型)来调用相应的函数版本。
注意,如果V中的show方法不是虚函数,那么无论传递的是V的对象还是Z的对象,调用的都将是V类中定义的show方法,因为此时不会发生多态性调用。