第12周-多继承、虚基类,继承跟组合-课后实践·阅读程序
第12周-多继承、虚基类,继承和组合-课后实践·阅读程序
运行结果:
运行结果:
运行结果:
运行结果:
修改后运行结果:
(a)
运行结果:
在main函数前增加一段函数:
main函数中指定部分为:
代码如下:
运行结果:
是通过作用域限定符解决了基类和派生类成员函数同名的问题。
/* * 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; }
是通过作用域限定符解决了基类和派生类成员函数同名的问题。