第12周-多继承、虚基类,继承和组合-课后实践·阅读程序
来源:互联网 发布:银行数据安全管理办法 编辑:程序博客网 时间:2024/05/29 10:09
/* * Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作 者:刘畅 * 完成日期:2015 年 5 月 24 日 * 版 本 号:v1.0 * * 问题描述:阅读程序~~* 输入描述: ;* 程序输出:。(1)
#include <iostream>using namespace std;class A{public: A() { a=0; } A (int i) { a=i; } void print() { cout<<a<<" "; }private: int a;};class B: public A{public: B() { b=0; } B(int i, int j, int k): A(i),aa(j) { b=k; } void print() { A::print(); aa.print(); cout<<b<<endl; }private: int b; A aa;};int main(){ B test[2]; test[0]=B(1,4,7); test[1]=B(2,5,8); for(int i=0; i<2; i++) test[i].print(); return 0;}
运行结果:
(2)
#include <iostream>using namespace std;class A{public: A(string s) { cout<<s<<endl; }};class B:public A{public: B(string s1, string s2):A(s1) { cout<<s2<<endl; }};class C:public A{public: C(string s1,string s2):A(s1) { cout<<s2<<endl; }};class D:public B,C{public: D(string s1,string s2,string s3,string s4):B(s1,s2),C(s3,s4) { cout<<s4<<endl; }};int main(){ D d("class A","class B","class C","class D"); return 0;}
运行结果:
贺老给的阅读代码好像出了点问题,char 的没有输出,于是我给改成了string。。。看运行结果就能大致明白它的构造函数的执行顺序了。
(3)
#include <iostream>using namespace std;class Base{public: Base(char i) { cout<<"Base constructor. --"<<i<<endl; }};class Derived1:virtual public Base{public: Derived1(char i,char j):Base(i) { cout<<"Derived1 constructor. --"<<j<<endl; }};class Derived2:virtual public Base{public: Derived2(char i,char j):Base(i) { cout<<"Derived2 constructor. --"<<j<<endl; }};class MyDerived:public Derived1,public Derived2{public: MyDerived(char i,char j,char k,char l,char m,char n,char x): Derived2(i,j), Derived1(k,l), Base(m), d(n) { cout<<"MyDerived constructor. --"<<x<<endl; }private: Base d;};int main(){ MyDerived obj('A','B','C','D','E','F','G'); return 0;}
运行结果:
这个还存有疑问。
(4)
#include<iostream>using namespace std;class A{public: int n;};class B:public A {}; // class B:virtual public A{};class C:public A {}; // class C:virtual public A{};class D:public B,public C{public: int getn() { return B::n; }};int main(){ D d; d.B::n=10; d.C::n=20; cout<<d.getn()<<endl; return 0;}
运行结果:
#include<iostream>using namespace std;class A{public: int n;};class B:virtual public A{};class C:virtual public A{};class D:public B,public C{public: int getn() { return B::n; }};int main(){ D d; d.B::n=10; d.C::n=20; cout<<d.getn()<<endl; return 0;}
修改后运行结果:
(5)
#include <iostream>using namespace std;class A{protected: int a,b;public: A(int aa, int bb):a(aa), b(bb) {} void printA() { cout<<"a: "<<a<<"\tb: "<<b<<endl; }};class B: public A{ int c;public: B(int aa, int bb, int cc):A(aa,bb),c(cc) {} void printB() { cout<<"a: "<<a<<"\tb: "<<b<<"\tc: "<<c<<endl; }};int main(){ A a(1,1); B b(2,3,4); //此处加入下面各小题中的代码 return 0;}
(a)
a=b; a.printA(); b.printA(); b.printB();运行结果:
(b)
b=a; a.printA(); b.printA(); b.printB();运行结果:
可以通过派生类对象向基类赋值,但反过来是行不通的
(c)
A &r1=a; A &r2=b; r1.printA(); r2.printA(); r2.printB();运行结果:
不能通过派生类对象去访问基类对象的成员,
删除后:
(d)
A *p=&a; p->printA(); p=&b; p->printA(); p->printB();
运行结果:
指向基类的指针只能访问派生类中的基类成员,而不能访问派生类中增加的成员。
删除后:
(e)
在classA中增加成员函数:
int getA(){return a;}
在main函数前增加一段函数:
void f(A x){ cout<<"aaaaah, my a: "<<x.getA()<<endl;}
main函数中指定部分为:
f(a); f(b);
代码如下:
#include <iostream>using namespace std;class A{protected: int a,b;public: A(int aa, int bb):a(aa), b(bb) {} void printA() { cout<<"a: "<<a<<"\tb: "<<b<<endl; } int getA() { return a; }};class B: public A{ int c;public: B(int aa, int bb, int cc):A(aa,bb),c(cc) {} void printB() { cout<<"a: "<<a<<"\tb: "<<b<<"\tc: "<<c<<endl; }};void f(A x){ cout<<"aaaaah, my a: "<<x.getA()<<endl;}int main(){ A a(1,1); B b(2,3,4); f(a); f(b); return 0;}
运行结果:
(6)补充阅读:
#include <iostream>using namespace std;class B{public: B(int x=0) { X=x; cout<<"B("<<x<<")\n"; } ~B() { cout<<"~B()\n"; } void print() { cout <<X<< " "; }private: int X;};class D: public B{public: D (int x, int y):B(x) { Y=y; cout<<"D("<<x<<","<<y<<")\n"; } ~D() { cout<<"~D()\n"; } void print() //与基类中的成员函数同名!这个冲突如何解决的?! { B::print(); cout <<Y<<endl; }private: int Y;};int main(){ D d(11,22); d.print(); return 0;}
是通过作用域限定符解决了基类和派生类成员函数同名的问题。
0 0
- 第12周-多继承、虚基类,继承和组合-课后实践·阅读程序
- 第11周-继承和派生-课后实践和阅读理解
- 第12周-多继承、虚基类,继承和组合-项目2-摩托车继承自行车和机动车
- 第12周-多继承、虚基类,继承和组合-项目1-教师兼干部类
- 第12周-多继承、虚基类,继承和组合-项目3-日期时间类
- 第5周课后实践·阅读程序
- 第6周课后实践·阅读程序
- 第4周课后实践·阅读程序-构造函数和析构函数(2)
- 第4周课后实践·阅读程序-构造函数和析构函数(3)
- 第4周课后实践·阅读程序-构造函数和析构函数(4)
- 第16周-异常处理和命名空间-课后实践·阅读程序
- 第11周 阅读程序-继承和派生2
- 第11周 程序阅读-继承和派生3
- 第11周 程序阅读-继承和派生4
- 第10、11周程序阅读 继承和派生 1
- 第12周-多继承、虚基类,继承和组合-项目4-点、圆的关系(1)
- 第12周-多继承、虚基类,继承和组合-项目4-点、圆的关系(2)
- 第12周-多继承、虚基类,继承和组合-项目4-点、圆的关系(3)
- 第十一周项目二 职员有薪水了1
- 第十二周阅读程序四
- 关于不停实时读写串口发生崩溃时报错:This message is already in use.
- 引用与数组,引用与类,引用与返回值,引用与多态,const引用,引用类型
- 《设计模式》第一章
- 第12周-多继承、虚基类,继承和组合-课后实践·阅读程序
- pthread_cond_wait详解
- C++找对象的季节(补)——信春哥是否能永生?
- MVC简单生成静态化页面
- 软考之路--尾声
- 自定义顶部标题栏和其事件监听设置
- tarjan求强联通分量
- 经典的延续还是失败的开始?ARM cortex m7性能初探
- 程序员的量化交易之路(8)---金融概念Listing&delisting