c/c++整理--c++继承

一、c++继承关系理解

请考虑下面标记为A~J的语句在编译时可能出现的情况,如果能够成功编译,请记为“RIGHT”,否则即为“ERROR”

#include <iostream>

using namespace std;

class Parent
{
private:
	int m_nPrt;
protected:
	int m_nPtd;
public:
	int m_nPub;
public:
	Parent(int val = -1)
	{
		m_nPub = val;
		m_nPtd = val;
		m_nPrt = val;
	}
};

class Child1 : public Parent
{
public:
	int getPub() { return m_nPub; }
	int getPtd() { return m_nPtd; }
	int getPrt() { return m_nPrt; }			//A
};

class Child2 : protected Parent
{
public:
	int getPub() { return m_nPub; }
	int getPtd() { return m_nPtd; }
	int getPrt() { return m_nPrt; }			//B
};

class Child3 : private Parent
{
public:
	int getPub() { return m_nPub; }
	int getPtd() { return m_nPtd; }
	int getPrt() { return m_nPrt; }			//C	
};

int main()
{
	Child1 cd1;
	Child2 cd2;
	Child3 cd3;
	
	int nval = 0;
	
	cd1.m_nPub = nval;						//D
	cd1.m_nPtd = nval;						//E
	nval = cd1.getPtd();					//F
	
	cd2.m_nPub = nval;						//G
	nval = cd2.getPtd();					//H
	
	cd3.m_nPub = nval;						//I
	nval = cd3.getPtd();					//J
	
	return 0;
}

A、B、C错误。m_nPrt是基类Parent的私有变量,不能被派生类访问。

D正确,Child1是public继承,可以访问基类的public成员

E错误,m_nPtd是基类的protected成员变量,通过public继承变成派生类的protected成员,因此只能在派生类内部访问,不能被对象访问。

F正确,可以通过成员函数访问protected变量。

G错误,这是protected继承,原有的public和protected的成员变量都变为protected变量,因此只能被类访问,不能被对象访问。

H正确,可以通过成员函数访问protected变量。

I错误,这是private继承,原有的变量都变为private,对象无法访问

J正确,可以通过成员函数访问private变量


二、看代码找错误——c++继承

#include <iostream>

using namespace std;

class base
{
	int i;
public:
	base(int x) { i = x; }
};

class derived : public base
{
	int i;
public:
	derived(int x, int y) { i = x; }
	void printTotal()
	{
		int total = i + base::i;
		cout<<"total = "<<total<<endl;
	}
};

int main()
{
	derived d(1, 2);
	d.printTotal();
	
	return 0;
}
这个程序有如下两个错误:

(1)在derived类进行构造时,它首先要调用其基类的构造方法,由于没有指明何种构造方法,因此默认调用base类不带参数的构造方法。然而,基类base中已经定义了带一个参数的构造函数,所以编译器就不会给它定义默认的构造函数了。因此代码第16行会出现找不到构造方法的编译错误。解决办法,在derived的构造函数添加基类的构造函数。

(2)在derived类的printTotal()中,使用base::i的方式调用base类的私有成员i,这个会得到“不能访问私有成员”的编译错误,解决办法,将i设为public。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值