c++继承指针的问题。父子类的赋值

问题描述

c++继承指针的问题。父子类的赋值
#include
using namespace System;

using namespace std;
class Base
{
public:
Base() :data(count)
{
cout << ""Base-ctor"" << endl;
++count;
}
~Base()
{
cout << ""Base-dtor"" << endl;
--count;
}
static int count;
int data;
};
int Base::count;
class Derived : public Base
{
public:
Derived() :data(count) data1(data)
{
cout << ""Derived-ctor"" << endl;
++count;
}
~Derived()
{
cout << ""Derived-dtor"" << endl;
--count;
}
static int count;
int data1;
int data;
};
int Derived::count = 10;
int main()
{
cout << sizeof(Base) << endl;
cout << sizeof(Derived) << endl;

Base* pb = new Derived[3];cout << pb[3].data<< endl;cout << ((static_cast<Derived*>(pb)) + 0)->data1 << endl;delete[] pb;cout << Base::count << endl;cout << Derived::count << endl;Console::Read();return 0;

}
这里的pb到底指向哪里,pb3的值为什么是10

解决方案

那个pb[3]中的3从何而来?下标不是从0开始的吗?
还有virtual的引入和用法要多看看。

照你上面那种写法,pb[3]表示的是,第二个Derived实例的基类中的data,即1。

解决方案二:
VS2010 X86环境中Sizeof(Base)为4,Sizeof(Derived)为12。因为pb[3]即*(pb + 3)且pb为Base类型指针,所以偏移12字节。
偏移后,pb实际上是指向第2个Derived了,因为你写的Base和Derived的大小刚好是3倍关系。所以pb[3].data输出的是第2个Derived的基类的data。这段代码里有太多巧合,画个图给你看下吧。

解决方案三:
pb执向的是Derived的首地址,,pb3是什么东西,请描述清楚点

解决方案四:
打印几个地址对比看看。多态只会用到虚函数。

时间: 2024-08-01 16:57:54

c++继承指针的问题。父子类的赋值的相关文章

c++ 类的指针数组-如何使用类指针数组实现以下的代码??

问题描述 如何使用类指针数组实现以下的代码?? 编写一个游戏平台.功能描述: 程序启动后,显示游戏列表(至少有三个游戏) 游戏1 游戏2 游戏3 用户选择其中一个游戏后,进入该游戏.游戏结束后,回到游戏列表.游戏列表按照游戏访问量动态排序. 定义游戏1类.游戏2.游戏3类,公有继承自CGame.游戏类自行设计,必须提供void start()作为游戏入口. 上面的要求如何实现??? #include<iostream> #include<algorithm> using names

基于java涉及父子类的异常详解_java

java中的异常涉及到父子类的问题,可以归纳为一句话:子类的构造函数抛出的异常必须包含父类的异常,子类的方法可以选择抛出"范围小于等于"父类的异常或不抛出异常. 1. 为什么构造函数必须抛出包含父类的异常? 在<thingking in java>中有这么一段话: 异常限制:当覆盖方法时,只能抛出在基类方法的异常说明中列出的那些异常 异常限制对构造器不起作用,你会发现StormyInning的构造器可以抛出任何异常,而不必理会基类构造函数所抛出的异常.然而因为必须构造函数必

JPanel继承问题... 写了一个类,继承自JPanel,但是控件不显示,跪求求各位大牛...

问题描述 JPanel继承问题... 写了一个类,继承自JPanel,但是控件不显示,跪求求各位大牛... 在做一个世界各个国家的时间的一个Demo.写了一个继承自JPanel类的panel,里面简单的设置了一个Logo,国家名字,还有一个按秒跳动时间,现在的问题就是在这个panel上的控件都不显示了,调了好久了也没有找到原因,所以没办法了,特来求助各位大牛们..... 话不多说,直接贴代码: package timerDemo; import java.awt.BorderLayout; im

定义类的指针变量如何重载类的拷贝构造函数和重载=号

问题描述 定义类的指针变量如何重载类的拷贝构造函数和重载=号 #ifndef LIST_OPRATOR #define LIST_OPRATOR #include using namespace std; class Complex { private: int a; char* p; public: void operator=(Complex* c2); Complex(const Complex* c2); Complex(int a,char* m); ~Complex() { cout

新手,子包中的类怎么继承父包中的类?

问题描述 子类的父类可否是父包中的类.. 解决方案 解决方案二:类是随意继承的吧不区分包的吧解决方案三:头一次听说子包和父包的概念解决方案四:java里面没有包继承包这个概念在struts2的xml配置文件有包继承包的概念解决方案五:java里没有子包和父包这种概念,比如说com.aa和com.aa.bb这两个包就像郭芙和郭芙蓉一样,之间是没有任何关系,你不能说叫郭芙蓉的就是郭芙的女儿.包只是一个单纯的限定名.解决方案六:可以继承,继承的时候,在类的上方导入父类所在的那个包就可以了解决方案七:你

java类-JAVA类中赋值问题,需要解释一下谢谢啦

问题描述 JAVA类中赋值问题,需要解释一下谢谢啦 class Test{ private DBUtil db=new DBUtil; private Connection conn=db.getConnect();//这些方法都有,getConnect是自己写的获得连接的方法,这样写是没有问题的. //接下来写各种方法 public xxxx(){} } class Test{ private DBUtil db=new DBUtil; private Connection conn=null

继承-C++,类模板作为基类派生及指针的问题。

问题描述 C++,类模板作为基类派生及指针的问题. **C++,类模板作为基类派生某几个类,可不可以定义指向基类的指针,然后通过这个指针来指向各个派生类?大家帮忙解答一下.我是初学者,勿喷啊!** 以下面例子为例.C++的. #include<iostream> using namespace std; template<class T1> class A { protected: T1 a; public: virtual void output1(); virtual void

可以继承的C++ Singleton基类

单例模式(Singleton Pattern)是设计模式中的一种,它用来保证系统中最多只能存在一个它的实例,其做法是由类自身来创建和持有它的对象实例,把对实例的创建权和管理权都控制在自己手中,以便控制实例数目. 关于如何在C++中实现单例模式的讨论已经太多了,我只是简单介绍一下可以继承的单例类. 首先介绍一下通常所见的单例类的写法,不妨设这个类叫做Singleton. Singleton.h: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

【转】可能继承的C++ Singleton基类

from:http://www.gocalf.com/blog/cpp-singleton.html      单例模式(Singleton Pattern)是设计模式中的一种,它用来保证系统中最多只能存在一个它的实例,其做法是由类自身来创建和持有它的对象实例,把对实例的创建权和管理权都控制在自己手中,以便控制实例数目.     关于如何在C++中实现单例模式的讨论已经太多了,我只是简单介绍一下可以继承的单例类.     首先介绍一下通常所见的单例类的写法,不妨设这个类叫做Singleton.