【C++】—— 继承与多态常见面试题

一、实现一个不能被继承的类

  • 实现一个不能被继承的类有两种方法,下面我们一一来解释:

1、在C++98中我们可以将基类构造函数私有化,派生类调不到基类的构造函数,则无法继承。

#include <iostream>
using namespace std;

class Person
{
public:
	static Person GetPerson()
	{
		return Person();
	}
private:
	Person()
	{}
	int _a;
};

class Student : public Person
{
private:
	int _b;
};

int main()
{
	Student s;
	return 0;
}

这里我们可以看到运行之后编译器的提示是无法访问基类的私有成员,因为我们将基类的构造函数私有化,而我们在创建一个派生类对象时,必须调用父类的构造函数对父类成员进行初始化,而父类的私有成员在子类是不可见的,因此无法调用,这是Person就是一个无法被继承的类。
不能被继承的类
也许有人会说,那我把Person类的构造函数私有化了,在类外也不能调Person类的构造函数创建Person类的对象了,那Person不就是个没有用的类了,这里我们给了一个接口是static Person GetPerson()我们在创建Person类对象时可以通过该接口调用类的构造函数初始化对象

2、在C++11中给出了一个新的 关键字final来禁止继承

class Person final
{
private:
	int _a;
};

class Student : class Person
{

private:
	int _b;
};

我们将加上关键字final的类称为最终类,此类不能被继承
不能被继承的类

二、多继承中指针偏移问题

class Base1 {
public:
	int _b1;
};
class Base2 {
public:
	int _b2;
};
class Derive : public Base1, public Base2 {
public:
	int _d;
};
int main()
{
	Derive d;
	Base1* p1 = &d;
	Base2* p2 = &d;
	Derive* p3 = &d;
	return 0;
}

这里有四个选项

  • A. p1 == p2 == p3
  • B. p1 < p2 < p3
  • C. p1 == p3 != p2
  • D. p1 != p2 != p3

如下图所示,我们可以清楚的看到p1指针和p3指针是相同的,虽然它们的含义不一样,但是在值上是相同的。
多继承中的指针偏移

三、计算一个类的大小

1、仅有一个类的情况

class Base
{
public:
	virtual void Func1()
	{
		cout << "Func1()" << endl;
	}
	void Func2()
	{
		cout << "Func2" << endl;
	}
private:
	int _b = 1;
};

int main()
{
	printf("%d\n", sizeof(Base));//8个字节
	return 0;
}

在32位系统下,是8个字节,因为32位系统下指针是4个字节,而Base类中有一个int型对象和一个虚基表指针详情参见博客 多态(下)之多态的实现原理
若是在64位系统下指针是8个字节,此时Base类的大小为12 字节
虚基表

2、有基类和派生类的情况

class Base
{
public:
	virtual void Func1()
	{
		cout << "Base::Func1()" << endl;
	}
	virtual void Func2()
	{
		cout << "Base::Func2()" << endl;
	}
	void Func3()
	{
		cout << "Base::Func3()" << endl;
	}
private:
	int _b = 1;
};
class Derive : public Base
{
public:
	virtual void Func1()
	{
		cout << "Derive::Func1()" << endl;
	}
private:
	int _d = 2;
};
int main()
{
	Base b;
	Derive d;
	printf("Base:%d\n", sizeof(Base));
    printf("Derive:%d\n", sizeof(Derive));

	return 0;
}

虚基表

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为你提供一个简单的继承多态的练习题,希望能帮助你巩固相关知识。 假设有一个图形类 Shape,其中包含一个纯虚函数 getArea(),用于计算该图形的面积。现在要定义两个子类,分别是矩形类 Rectangle 和圆形类 Circle。请完成以下任务: 1. 定义 Shape 类: ```c++ class Shape { public: virtual double getArea() = 0; // 纯虚函数 }; ``` 2. 定义 Rectangle 类,继承自 Shape 类,包含两个成员变量 width 和 height,以及实现 getArea() 函数的具体方法: ```c++ class Rectangle : public Shape { private: double width; double height; public: Rectangle(double w, double h) { width = w; height = h; } double getArea() { return width * height; } }; ``` 3. 定义 Circle 类,同样继承自 Shape 类,包含一个成员变量 radius,以及实现 getArea() 函数的具体方法: ```c++ class Circle : public Shape { private: double radius; public: Circle(double r) { radius = r; } double getArea() { return 3.1415926 * radius * radius; } }; ``` 4. 在主函数中创建一个 Shape 指针数组,分别指向一个 Rectangle 和一个 Circle 对象,并计算它们的面积: ```c++ int main() { Shape* shapes[2]; shapes[0] = new Rectangle(4, 5); shapes[1] = new Circle(3); for (int i = 0; i < 2; i++) { cout << "Area of shape " << i << ": " << shapes[i]->getArea() << endl; delete shapes[i]; } return 0; } ``` 以上就是一个简单的继承多态的练习题,希望能够帮助你巩固相关知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值