面试题答案
一键面试- 将派生类对象指针转换为基类对象指针的情况:
- 在C++私有继承体系中,将派生类对象指针转换为基类对象指针,从语法上,如果不使用显式类型转换(如
reinterpret_cast
等),是不允许的。因为私有继承意味着基类的接口对于派生类的用户(包括通过指针访问的情况)是不可见的。如果使用reinterpret_cast
进行强制转换,虽然可以编译通过,但这种转换是不安全的,它绕过了C++的访问控制机制。
- 在C++私有继承体系中,将派生类对象指针转换为基类对象指针,从语法上,如果不使用显式类型转换(如
- 多态性的工作情况:
- 在私有继承下,多态性不能正常工作。多态性依赖于通过基类指针或引用调用虚函数,在运行时根据对象的实际类型来确定调用哪个函数版本。但私有继承使得基类指针不能安全合法地指向派生类对象,所以无法实现运行时多态。
- 在不改变继承方式为公有继承的前提下实现多态性的方法:
- 原理:可以通过在派生类中提供一个成员函数,该函数返回一个指向基类子对象的指针或引用,并且将这个函数设置为
public
。这样外部代码可以通过调用这个函数来获取基类子对象的指针或引用,进而利用多态性。同时,在基类中定义虚函数,派生类中重写这些虚函数。 - 代码示例:
- 原理:可以通过在派生类中提供一个成员函数,该函数返回一个指向基类子对象的指针或引用,并且将这个函数设置为
#include <iostream>
class Base {
public:
virtual void print() {
std::cout << "Base::print()" << std::endl;
}
};
class Derived : private Base {
public:
void print() override {
std::cout << "Derived::print()" << std::endl;
}
Base* getBasePtr() {
return this;
}
};
int main() {
Derived d;
Base* ptr = d.getBasePtr();
ptr->print();
return 0;
}
在上述代码中,Derived
类私有继承自Base
类。Derived
类提供了一个public
成员函数getBasePtr
,它返回一个指向Base
类子对象的指针。在main
函数中,通过这个函数获取Base
类指针,然后调用虚函数print
,实现了一定程度的多态性。