【C++之继承性和派生类(练手题)】教程文章相关的互联网学习教程文章

Effective C++:条款32:确定你的public继承塑模出is-a关系

(一)public继承意味着“is-a”关系。它的意思是:如果B以public形式继承自A,那么B类型对象肯定是一个A对象,反之不成立。A是B的一种抽象,B是A的特例。任何使用A的地方,都能使用B。(二)public继承意味着“is a”(是一种)关系:(1)任何一个继承类对象也是一个基类对象;(2)任何可以出现基类对象的地方也可以出现一个继承类对象(例如函数的实参);(3)任何一个可以在基类对象上所做的操作,同样也可以在派生类上操作(...

C++三种继承方式【代码】

一、三种继承方式继承方式不同,第一个不同是的是派生类继承基类后,各成员属性发生变化。第二个不同是派生类的对象能访问基类中哪些成员发生变化。表格中红色标注。 1 #include <iostream>2usingnamespace std;3 4class A5{6private:7int i;8protected:9int j; 10public: 11int k; 12}; 1314class B:public A 15{ 1617}; 1819int main() 20{ 21 B b; 22 b.k=1; 23 }1、只有当B,public继承A的时候,才能b.k=1。因为只有当p...

C++_练习—继承_保护继承【代码】

保护继承protected:保护继承保护继承:当保护继承时,基类的公有和保护成员变成派生类的保护成员,私有成员不可直接访问! 1 #include <iostream>2 3usingnamespace std;4 5class info {6public:7void setter(int a,int b){8 num = a;9 age = b; 10 } 1112int getter(void) { 13int a = age; 14return a; 15 } 1617void pri(void) { 18 cout << num << endl; 19 cout << age << endl; 20 ...

一个C++继承、虚函数和多态性的实例代码

#include <iostream> #include <string>using namespace std;namespace Animals {class Dog {private:string name;public:Dog(string name) : name(name) {}Dog() : name(NULL) {}virtual void bark() {cout << "Baseclass: Hi, " << name << endl;}string getName() {return name;}void setV(string aname) {name = aname;}};class SDog : public Dog {public:SDog(string name) : Dog(name){}virtual void bark() {Dog::bark();c...

C++类继承内存布局(二)【代码】

转自:http://blog.csdn.net/jiangyi711/article/details/4890889#(二 )成员变量前面介绍完了类布局,接下来考虑不同的继承方式下,访问成员变量的开销究竟如何没有继承:没有任何继承关系时,访问成员变量和C语言的情况完全一样:从指向对象的指针,考虑一定的偏移量即可单继承:由于派生类实例与其基类实例之间的偏移量为0,所以直接利用基类指针和基类成员之间的偏移量关系D* pd; pd->c1; // *(pd + dDC + dCc1); // *(pd + d...

C++虚继承

首先看一段代码:class B { public : int b; }; class D: virtual public B { public : int d; };int _tmain(int argc, _TCHAR* argv[]) { cout<<sizeof(D)<<endl; }; 在vs输出12,当将virtual关键字去掉之后,输出8;可见虚拟继承需要额外的空间开销。在vs中,引入了所谓的“虚基类表”(类似虚函数表),同时每个Class Object中有一个指向虚基类表的指针,虚基类表中存放着对应虚基类对象的指针(地址)。那么两个虚基类的情况...

C++继承与多态示例

#include <iostream> #include <string>using namespace std;class Pet {protected:string name;public:void setname(string aname) {this->name = aname;}virtual string bark() {return name + ", Hello";} };class Dog : public Pet {public:virtual string bark() {string tmp = Pet::bark();return tmp + ", dog";} };int main() {Dog d;d.setname("doga");cout << d.bark() << endl;return 0; }原文:http://blog.csdn.net/m...

c++继承:同名隐藏【代码】

不同作用域声明的标识符的可见性原则:如果存在两个或者多个具有包含关系的作用域,外层声明了一个标识符,而内层没有再次声明同名标识符,那么外层标识符在内层依然可见;如果在内层声明了同名标识符,则外层标识符在内层不可见,这时称内层标识符隐藏了外层同名标识符,这种现象称为隐藏规则。在类的派生层次结构中,基类的成员和派生类新增的成员都具有类作用域。二者的作用范围不同,是相互包含的两个层,派生类在内层。这时,...

C++中封装和继承的访问权限【代码】

众所周知,C++面向对象的三大特性为:封装,继承和多态。下面我们就先对封装做一些简单的了解。封装是通过C++中的类来完成的,类是一种将抽象转换为用户定义类型的工具。类的定义如下:class circle {public: //成员变量int m_L;int m_H;public: //成员函数(方法)double get_Square(){return m_L*m_H;} } 在上面的代码中,我们定义了一个 "circle" 类,主要包含三个部分:成员变量,成员方法和访问控制(public, protect, priv...

C++程序设计_第6章_继承和派生【代码】

例6.1使用默认内联函数实现单一继承。 1 #include<iostream>2 3usingnamespace std;4 5class Point6{7private:8int x, y;9public: 10 Point(int a, int b) 11 { 12 x = a; 13 y = b; 14 cout << "Point..." << endl; 15 } 16void Showxy() 17 { 18 cout << "x=" << x << "y=" << y << endl; 19 } 20 ~Point() 21 { 22 cout << "Delete Point" << endl; 23 } 2...

用C++实现一个不能被继承的类【代码】【图】

1 #include<iostream>2usingnamespace std;3class Gradpa4{5 friend class Parent;//声明public或者private都无影响 6private:7 Gradpa(){8 cout<<"I m Gradpa"<<endl;9 }; 10 ~Gradpa(){}; 1112}; 1314class Parent: virtualpublic Gradpa 15{ 16public: 17 Parent(){ 18 cout<<"I m Parent"<<endl; 19 }; 20 ~Parent(){}; 21}; 2223class Child:public Parent 24{ 25public: 26 Child(){...

C++_代码重用4-多重继承

继承使用时要注意,默认是私有派生。所以要公有派生时必须记得加关键字Public。MI(Multi Inheritance)会带来哪些问题?以及如何解决它们?两个主要问题: 从两个不同的基类继承同名方法; 从两个或更多相关基类那里继承同一个类的多个实例;虚方法Worker公有派生出Singer和Waiter;然后Singer和Waiter公有派生出SingingWaiter(即多重继承);这样会导致一个问题,就是SingingWaiter中有两个Worker组件。通常可以将派...

c++多重继承

可以在子类中通过基类名访问函数// oj4.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include<iostream>#include<vector>using namespace std;class A{public: A(){ cout << "A" << endl; } int a; virtual void play(){ cout << "i am in A" << endl; } void set(int _a) { this->a=_a; }};class B: public A{public: B(){ A::set(8); cout << "B" << endl; } void play(){ }};class C : p...

C++进阶--代码复用 继承vs组合【代码】

//############################################################################ /** 代码复用: 继承 vs 组合*///继承实现代码复用 class BaseDog {...... // 公共的操作 };class BullDog : public BaseDog {... // 调用公共操作,执行更多任务 };class ShepherdDog : public BaseDog {... // 调用公共操作,执行更多任务 };// 组合实现代码复用class ActivityManager {... // 公共操作 };class Dog {... };class BullDog : pub...

c++面向对象继承【图】

1.面向对象程序设计有4个主要的特点:抽象、继承、封装、多态。2.类和类之间的关系:包含关系;使用关系;继承关系。3.继承的重要说明:子类拥有父类的所有成员变量和成员函数;子类可以拥有父类没有的成员方法和属性;子类就是一种特殊的父类;子类对象可以当作父类对象使用;4.继承中的类型兼容性原则:兼容性原则是指在需要基类的任何地方,都可以使用派生类对象来代替;通过公有继承派生类获得了基类中处构造函数、析构函数外的...