【C++】派生类对象初始化基类的引用

//派生类对象初始化基类的引用
//引用是别名,但这个别名只能包含派生类对象中的由基类继承来的隐藏对象

#include <iostream>
using namespace std;
class B
{
public:
	B()
	{
		cout<<"B"<<endl;
	}
	void fun()
	{
		cout<<"B::fun()"<<endl;
	}
private:
	int x;
};

class D : public B
{
public:
	D()
	{
		cout<<"D"<<endl;
	}
	void fun()
	{
		cout<<"D::fun()"<<endl;
	}
	void show()
	{
		cout<<"D::show()"<<endl;
	}
private:
	int y;
};
void main()
{
	D d;
	B &p=d;
	p.fun();
//	p.show();          //错误,派生类对象初始化基类的引用不能用于派生类
}
<img src="http://img.blog.csdn.net/20150512213405630?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZG91ZG91d2ExMjM0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

时间: 2024-12-30 03:36:25

【C++】派生类对象初始化基类的引用的相关文章

派生类地址比基类地址少4(子类与基类指针强行转换的时候,值居然会发生变化,不知道Delphi BCB是不是也这样) good

大家对虚表并不陌生,都知道每个含有虚函数的类对象都有1个虚指针,但是在现实使用中,却总是因为这而调试半天,才发现原来是虚指针惹的祸.我这几天在调试代码时候也中招了,我的问题是这样的,如下图,CTree是最底层基类(非虚类), CSamplerTree(虚类)派生自CTree,CMSamplerTree,CASamplerTree派生自CSamplerTree,                                                         CTree中包括两个成员

派生类(多级)到基类转换的可访问性

<C++primer>第四版 15.3.1节提到基类到派生类转换(无论ref/poniter or not)的可行性,有些拗口,根据英文版翻译,得到以下几个要点: 1.如果是 public 继承,则用户代码和后代类都可以使用派生类到基类的转换. 2.如果类是使用 private 或 protected继承派生的,则用户代码(即派生类对象)不能将派生类型对象转换为基类对象. 3.如果是 private 继承,则从 private 继承类派生的孙类不能转换为基类. 4.如果是 protected 

C++虚函数的陷阱--派生类对象的基类函数调用基类虚函数出错

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">最近写程序的时候发现,派生类对象的基类函数如果调用基类虚函数,则它将调用的是派生类的对应函数,而不是我想调用的基类的对应函数.</span> 下面用一个例子来说明: //基类 class Base { public: void funA(); virtual void fun

【C++】通过基类的指针变量访问派生类中由基类继承来的隐藏对象

//<img src="http://img.blog.csdn.net/20150512213309005?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZG91ZG91d2ExMjM0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /> // 可以将一个派生类的对象的地址赋给其基类的指针变量,但

C#类对象初始化过程

C#类实例的初始化是这样进行的:在调用构造函数的入口处先初始化自身数据成员,若声明字段时显式给出了初始化语句则按初始化语句进行,否则若是基本类型例如int或string则初始化为0或"",若是类则保持为null:若该类含有基类则下一步调用基类构造函数,基类构造函数的执行过程同上,最后调用派生类构造函数的函数体. 以上过程纯属自己的验证加猜测. C#成员初始化列表中只能对base进行初始化. C#的初始化和C++有点不一样啊,似乎还更加隐晦,派生类的成员初始化为什么要比基类更早.感觉越是

C#派生类中使用基类protected成员的方法

我们知道C#中通过继承可以使一个具有公共数据和方法的基类被广泛应用从而减少代码量,这样派生类会具有基类中所有成员(除构造器等),我们理所当然可以通过派生类实例来使用基类的成员.那么当基类成员被protected修饰时,我们应该怎么在派生类中使用基类成员呢,下面将介绍使用方法. 首先我们贴一段错误的使用代码: 1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Console.ReadLine(); 6 7 } 8 } 9 pub

C++ - 派生类强制转换为基类

派生类强制转换为基类 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24268821 在多态的使用时, 派生类的指针或引用能够转换为基类的指针或引用, 即基类的指针能够指向派生类的基类部分; Base* b = Derived* d; b和d指向的内容是相等的, b == d, 由于之间有一个隐式转换即 b == (Base*)d; b和d的地址是不同的 int(b) != int(d), 由于b指向d的基类部分, d指向的是

再以Circle类为直接基类,派生出一个Cylinder(圆柱体)类,再增加数据成员h(高),,以及求圆柱表面积的成员函数area和求圆柱体积的成员函数volume,实现需要的成员函数,并设计main

/* *Copyright (c) 2016,烟台大学计算机学院 *All rights reserved. *文件名称:main.cpp *作 者:郭辉 *完成时间:2016年5月10日 *版 本 号:v1.0 * *问题描述:再以Circle类为直接基类,派生出一个Cylinder(圆柱体)类,再增加数据成员h(高),,以及求圆柱表面积的成员函数area和求圆柱体积的成员函数volume,实现需要的成员函数,并设计main函数完成测试. *输入描述:无. *程序输出:体积,表面积. */ #

何使用派生类指针指向基类,即downcast向下转型?

基类指针指向派生类,我们已经很熟了.(视频下载) (全部书籍)假如我们想用派生类反过来指向基类,就需要有两个要求:1)马克-to-win:基类指针开始时指向派生类,2)我们还需要清清楚楚的转型一下. if you want to use derived class pointer point to base class, there are two requirements: 1) base class pointer is initially the type of the derived c