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

来源:互联网 发布:mac的鼠标不能按右键 编辑:程序博客网 时间:2024/05/17 16:16

一、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;//Dcd1.m_nPtd = nval;//Enval = cd1.getPtd();//Fcd2.m_nPub = nval;//Gnval = cd2.getPtd();//Hcd3.m_nPub = nval;//Inval = cd3.getPtd();//Jreturn 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。