c++ 子类切勿重新定义父类 non-virtual函数

子类如果重新定义了父类的non-virtual函数则不会有多态效果。

为方便描述,这里的方法和继承方式都用public。至于原因嘛,你懂的!

1:子类直接继承父类方法

class BaseOption
{
public:
    void Function();
};

void BaseOption::Function()
{
    cout<<"BaseOption::Function()"<<endl;
}

class SubOption :
    public BaseOption
{
};

int _tmain(int argc, _TCHAR* argv[])
{
    SubOption obj;
    BaseOption *pBase = &obj;

    SubOption *pSub = &obj;

    pBase->Function();     pSub->Function();}

输出:

"BaseOption::Function()"
"BaseOption::Function()"

这里使用BaseOption 和SubOption 调用Function都能调进BaseOption::Function();

2:为了实现多态效果,把父类Function()改为virtual,在子类中重新实现

class BaseOption
{
public:
    virtual void Function();
};

void BaseOption::Function()
{
    cout<<"BaseOption::Function()"<<endl;
}

class SubOption :
    public BaseOption
{
public:
       void Function();
};

void SubOption::Function()
{
  cout<<"SubOption::Function()"<<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    SubOption obj;
    BaseOption *pBase = &obj;

    SubOption *pSub = &obj;

    pBase->Function();

 pSub->Function();}

这就是我们常说的多态。

输出:
"SubOption::Function()"
"SubOption::Function()"

3:子类直接重新定义父类non-virtual方法,这背时的做法,在这种情况下就没有了多态属性,至于这种设计方法的弊端,没得说。

class BaseOption
{
public:
    void Function();
};

void BaseOption::Function()
{
    cout<<"BaseOption::Function()"<<endl;
}

class SubOption :
    public BaseOption
{
public:
       void Function();
};

void SubOption::Function()
{
  cout<<"SubOption::Function()"<<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    SubOption obj;
    BaseOption *pBase = &obj;
    SubOption *pSub = &obj;
    pBase->Function();
    pSub->Function();
}

输出:
BaseOption::Function()

SubOption::Function()

虽然实例对象时SubOption obj,但在调用时候 由BaseOption指针pBase会调进BaseOption中,这也是哦,SubOption is-a BaseOption .

c++ 子类切勿重新定义父类 non-virtual函数

时间: 2024-11-10 00:37:33

c++ 子类切勿重新定义父类 non-virtual函数的相关文章

c++ 切勿重新定义继承来的带缺省参数的函数

切勿重新定义继承来的带缺省参数的函数.我们知道,继承来的函数是virtual 的,至于原因在上一节中已经说明了,即“切勿重新定义父类non-virtual函数”.所以确切的描述应该是“切勿重新定义继承来的带缺省参数的virtual函数”.因为缺省参数是静态绑定,而virtual是动态绑定. typedef enum _ColorEnum{ eRed = 1, eYellow, eBlack }ColorEnum; class BaseOption { public: BaseOption(voi

子类继承和调用父类的构造方法 (转)

子类继承和调用父类的构造方法1.如果子类没有定义构造方法,则调用父类的无参数的构造方法,.2.如果子类定义了构造方法,不论是无参数还是带参数,在创建子类的对象的时候,首先执行父类无参数的构造方法,然后执行自己的构造方法.3.如果子类调用父类带参数的构造方法,可以通过super(参数)调用所需要的父类的构造方法,切该语句做为子类构造方法中的第一条语句.4.如果某个构造方法调用类中的其他的构造方法,则可以用this(参数),切该语句放在构造方法的第一条.说白了:原则就是,先调用父亲的.(没有就默认调

C++ 当子类的方法和父类的方法重名时...

C++当子类的成员函数与父类的成员函数重名时: 若父类没有virtual声明,子类函数可以和父类函数返回值不同,但函数名和参数列表必须相同. 则子类实例通过"."调用的是子类的函数 若子类想调用父类的函数,则需要使用 子类实例.父类::函数名() 的形式. 父类实例通过"."调用的是父类的函数 父类无法调用子类的同名函数 若通过指针->调用 则指针的类型 决定 调用哪个类的函数 父类地址强制转换为子类指针 也可以调用子类的函数. 若父类有virtual声明,

c++ 子类构造函数初始化及父类构造初始化

我们知道,构造方法是用来初始化类对象的.如果在类中没有显式地声明构造函数,那么编译器会自动创建一个默认的构造函数:并且这个默认的构造函数仅仅在没有显式地声明构造函数的情况下才会被创建创建. 构造函数与父类的其它成员(成员变量和成员方法)不同,它不能被子类继承.因此,在创建子类对象时,为了初始化从父类中继承来的成员变量,编译器需要调用其父类的构造函数.如果子类的构造函数没有显示地调用父类的构造函数,则默认调用父类的无参构造函数,至于什么事显式调用,在下面会详细说明!关于子类中构造函数的构造原则,总

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 分析以上程

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承.(4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承. 分析以上程序示例,主要疑惑点是“子类继承父类的成员变量,父类对象是否会实例化?私有成员变量是否会被继承?被继承的成员变量

微信营销火热但是切勿过激

近2年来越来越火爆的微信营销不断吸引着人们的眼球,似乎短期内通过微信销售营造爆款的人更是数不胜数,身边有越来越多的人开始转行做微信营销.然而在如此众多人涌入的时候,如何将微信营销的质量保持住就是一个巨大的困难,至少在我看来,微信营销,火热但是切勿过激.相对来说,微信营销可以让使用者与经营者之间建立一个更为私密的环境,而微信营销者可以通过微信和用户保持联系,而这是其它的平台所不具有的优势,其次微信营销,可以直接将自己营销的商品直接呈现在眼前,而这种营销方式更为直接,也更为消费者带来更多的便利,有利

override(重写,覆盖) 1、方法名、参数、返回值相同。 2、子类方法不能缩小父类方法的访问权限。 3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。 4、存在于父类和子类之间。 5、方法被定义为final不能被重写。 overload(重载,过载) 1、参数类型、个数、顺序至少有一个不相同。 2、不能重载只有返回值不同的方法名。 3、存在于父类和子

override(重写,覆盖) 1.方法名.参数.返回值相同. 2.子类方法不能缩小父类方法的访问权限. 3.子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常). 4.存在于父类和子类之间. 5.方法被定义为final不能被重写. overload(重载,过载) 1.参数类型.个数.顺序至少有一个不相同.   2.不能重载只有返回值不同的方法名. 3.存在于父类和子类.同类中. 方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现. 重写(O

验证当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。

结果:当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行.

切勿创建包含auto_ptr的容器对象

 当你拷贝一个auto_ptr时,它所指向的对象的所有权被移交到拷入的auto_ptr上,而它自身被置为NULL.我的理解是:拷贝一个auto_ptr意味着改变它的值.例如: auto_ptr<int> pint1(new int);//pint1指向一个int auto_ptr<int> pint2(pint1);//pint2指向pint1的int:pint1被置为NULL pint1 = pint2;//现在pint1又指向int了:pint2被置为NULL 在看一种实现