c++ 子类要正确的调用父类构造函数

class base{
    public:
        int i,j;
        base(){
            i=j=0;
        }
        base(int a,int b){
            i=a;j=b;
        }
};
class deried:public base{
        public:
        deried(int a,int b){
             base(a,b);
        }
};    

int main(){
  deried d(3,1);
  cout<<d.i<<" "<<d.j<<endl;
  return 0;
}

上面的这段代码会输出什么呢?!正确的答案是输出了"0 0". 我的理解是,虽然其中调用了base(a,b) 但是其实操作的a和b不是当前d的a,b,其实是定义了一个新的base的对象。正确的写法应该是下面这样

class base{
    public:
        int i,j;
        base(){
            i=j=0;
        }
        base(int a,int b){
            i=a;j=b;
        }
};
class deried:public base{
        public:
        deried(int a,int b):base(a,b){

        }
};    

int main(){
  deried d(3,1);
  cout<<d.i<<" "<<d.j<<endl;
  return 0;
}
时间: 2024-10-23 14:00:07

c++ 子类要正确的调用父类构造函数的相关文章

C++子类调用父类构造函数

构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法).因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法. 如果没有显式的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没有显式地声明构造函数情况下创建. 构造原则如下: 1. 如果子类没有定义构造方法,则调用父类的无参数的构造方法. 2. 如果子类定义了构造方法,不论是无参数还是带参数,在创建子类的对象的时候,

为什么在新建子类时要先调用父类的构造器

子类构造器会默认调用 父类的无参构造器,如果父类没有无参构造器,则需在子类构造器的第一行显式地调用父类的其他构造器. 其次,从继承的思想来看,你继承一个类,就相当于扩展一个类,形成一个更为特殊的类,但经常,我们需要将子类向上转型为基类,以便使用或达到其他各种目的. 这时,如果你生成子类对象时没有调用父类的构造器,那么,我们在使用父类的一些成员变量的时候,就会报变量未初始化的错误.请记住,变量初始化总是在构造器调用之前完成! 构造一个对象,先调用其构造方法,来初始化其成员函数和成员变量.子类拥有父

23.C++- 继承的多种方式、显示调用父类构造函数、父子之间的同名函数、virtual虚函数

在C++中,继承方式共有3种: public继承 -指父类的成员(变量和函数)访问级别,在子类中保持不变 private继承 -指父类的成员,在子类中变为private私有成员. -也就是说子类无法访问父类的所有成员 protected继承 -指父类的public成员 ,在子类中变为protected保护成员,其它成员级别保持不变 <span "="" src="https://images2018.cnblogs.com/blog/1182576/20180

Effective JavaScript Item 38 在子类构造函数中调用父类构造函数

本系列作为Effective JavaScript的读书笔记. 在一个游戏或者图形模拟的应用中,都会有场景(Scene)这一概念.在一个场景中会包含一个对象集合,这些对象被称为角色(Actor).而每个角色根据其类型会有一个图像用来表示,同时场景也需要保存一个底层图形展示对象的引用,被称为上下文(Context): function Scene(context, width, height, images) { this.context = context; this.width = width

java创建一个子类对象是会调用父类的构造方法会不会创建父类

1.子类在创建实例后,类初始化方法会调用父类的初始化方法(除了Java.lang.Object类,因为java.lang.Object类没有父类),而这种调用会逐级追述,直到java.lang.Object的初始化方法.这个地方我说的是初始化方法,而不是构造方法,因为构造方法是相对于java源程序而言,而编译后的class文件是初始化方法即" <init>"方法(红色部分为方法名),初始化方法是由java源程序的三个部分组成的,一个部分是成员字段后的直接的初始化语句,例如p

php子类是否自动调用父类构造函数

如果子类没自定义构造函数,则自动执行父类的构造函数, 反之,则要显式调用parent::__construct() 原文地址:https://www.cnblogs.com/wangshuazi/p/10033621.html

Qt学习之路【2】:调用父类构造函数

阅读Qt代码的时候经常遇见这样一类代码: QPlayer::QPlayer(QWidget *parent) :QMainWindow(parent) QPlayer是一个类,"::"后面跟着的是一个构造函数.但是这个构造函数之后的":"后面的QMainWindow(parent)该怎样去理解呢? 我们都知道在C++中,如果两个类A与B之间是继承关系,则A与B之间可以用":"连接,但是类是没有参数的.因此QMainWindow(parent)是不

子类调用父类的构造函数

当子类在声明对象实例时,想显式调用父类的有参构函数.注意:不能在构造函数中直接调用父类的构造函数,否则会调用两次.应该通过参数列表来调用.代码如下: class?MyClassA//父类 { public: MyClassA(?CString?str?) { AfxMessageBox(str); } ~MyClassA() { } private: }; class?MyClassB:public?MyClassA//子类 { public: MyClassB():MyClassA(_T("子

Java -- 子类使用super调用父类的方法A,A 调用了方法B,子类也override方法B,那么super.A()最终调用到了子类的B方法

public class SuperClass{ public void printA(){ System.out.print("SuperClass-printA"); printB(); } public void printB(){ System.out.print("SuperClass-printB"); } } public class ChildClass extends SuperClass{ public void printA(){ System