重拾C++之虚函数和虚基类以及抽象类

一、引言

好久没接触过C++了,今天突然要用一点感觉号蛋疼,用惯了python感觉C++一点都不会了。

声明了一个类的对象居然用这种方法,脑子绝对是被驴(python)踢了
class A{
 ...
 }
 a=A();//尼玛这都能行,被踢大了
二、虚函数和一般函数

虚函数就是加了vritual关键字的函数,引入虚函数的目的是为了实现多态性(在此为运行时的多态性),即可以通过父类的指针调用子类的对象,从而产生不同的效果。

    virtual void show(){
        cout<<"hello my name is a"<<endl;
    }

废话不多说,为了展示虚函数和一般函数的区别看看下面一个个例子:

#include<iostream>
using namespace std;

class A{
private:
    int a;
    int b;
public:
    A(int a,int b){
        this->a=a;
	this->b=b;
        cout<<"hello base A"<<endl;
        cout<<a<<‘-‘<<b<<endl;
    }
    //定义一个虚函数
    virtual void show(){
        cout<<"hello my name is a"<<endl;
    }
};
class D:public A{
public:
    D(int a,int b):A(a,b){
        cout<<"hello base A"<<endl;
        cout<<a<<‘-‘<<b<<endl;
    }
    void show(){
        cout<<"hello my name is d"<<endl;
    }
};
class E:public A{
public:
    E(int a,int b):A(a,b){
        cout<<"hello base A"<<endl;
        cout<<a<<‘-‘<<b<<endl;
    }
    void show(){
        cout<<"hello my name is e"<<endl;
    }
};
int main()
{
    A *p;
    D d = D(1,2);
    p=&d;
    p->show();
    E e = E(1,2);
    p=&e;
    p->show();
}

编译,运行输出中有这么两行:

hello my name is d
hello my name is e

然后去掉关键字vritual,在编译运行,上面两行变成了

hello my name is a
hello my name is a

看到区别了吧!对于普通函数,虽然父类的指针指向了子类的对象,但是调用的仍然是父类的函数,而虚函数则是执行子类中新定义的函数。

三、虚函数和纯虚函数

学过java的都知道有类和接口两种不一样的东西(其实我在装逼,java也就会i++了.*_*!!),纯虚函数就类似于接口,纯虚函数不能在定义类中实现,但应该在能够实例化的子类中实现。定义了纯虚函数的类就要抽象类(记住是抽象类不是虚基类,网上有个逼说是虚基类,此贴居然还有好多人转发,真是害人不浅。好吧也许真是虚基类,那就当我是逼吧^_^)。抽象类不能够被实例化。

四、虚继承和虚基类

虚继承的主要是为了解决多重继承中出现的二义性问题,普通继承如果一个基类通过几条路径继承到了一个派生类中,那么这个派生类将有两个基类的副本,对这些成员的访问将会出现二义性错误。

//虚继承是这样的
class A :public vritual B{
....
}

虚基类:虚基类是指虚继承中的基类,记住不是含有纯虚函数的类(抽象类)

注意:对于虚基类的初始化即使是是间接继承,在派生类的构造函数中也应该显示的调用其构造函数,否则将调用默认的构造函数(没有参数,如果没有定义自己的构造函数,系统将会定义默认的构造函数,否则没有默认构造函数),如果没有默认构造函数,程序将会出错。

五、总结

虚函数是为了实现多态性,虚基类是为了解决多重继承的二义性问题,除此之外似乎没有任何关系(唯一有关系也是虚的,所以有关系是假的)。

虚基类是虚继承中的基类,抽象类是含有纯虚函数的类,两者完全不同。

时间: 2024-08-12 22:49:25

重拾C++之虚函数和虚基类以及抽象类的相关文章

C++ 纯虚函数与抽象基类

在C++ 中,虚函数可以很好的实现多态,然而也有一定的局限,这个局限在于,虚函数必须在基类中定义,哪怕是空的实现. 例如下面这段代码编译时就会出错: class Base { virtual void print(); }; class Derived:Base { void print() { cout << "Derived" <<endl; } }; 因为Base类中的虚函数print()没有定义. 而在实际编程时我们往往会遇到无法给基类的函数定义的情况,

纯虚函数与抽象基类

这一节我们主要介绍一下抽象基类与纯虚函数的关系 首先,我们来看看纯虚函数 1.纯虚函数的定义   纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法.在基类中实现纯虚函数的方法是在函数原型后加"=0".如下     virtual void funtion()=0 2.定义纯虚函数的目的和意义 定义纯虚函数是为了实现一个接口,起到一个规范的作用.纯虚函数的意义在于:让所有的类对象(主要是派生类对象)都可以执行纯虚函数的动作,但类无法为纯虚函数提供

简单工厂类,有继承、虚函数重写、基类指针指向子类对象会发生多态(1)

class Fruit { public: virtual void get_fruit() { std::cout<<"Fruit:getFruit"<<std::endl; } }; class Pear : public Fruit { public: virtual void get_fruit() { std::cout<<"Pear:getFruit"<<std::endl; } }; class Bana

[转]什么是C++虚函数、虚函数的作用和使用方法

我们知道,在同一类中是不能定义两个名字相同.参数个数和类型都相同的函数的,否则就是“重复定义”.但是在类的继承层次结构中,在不同的层次中可以出现名字相同.参数个数和类型都相同而功能不同的函数.例如在例12.1(具体代码请查看:C++多态性的一个典型例子)程序中,在Circle类中定义了 area函数,在Circle类的派生类Cylinder中也定义了一个area函数.这两个函数不仅名字相同,而且参数个数相同(均为0),但功能不同,函数体是不同的.前者的作用是求圆面积,后者的作用是求圆柱体的表面积

纯虚函数与虚基类

纯虚函数 1.定义 纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法.在基类中实现纯虚函数的方法是在函数原型后加"=0" virtual void funtion()=0: 虚函数的定义是:virtual void funtion(): 2.引入原因: 1.为了方便使用多态特性,我们常常需要在基类中定义虚函数. 2.但在很多情况下,基类本身生成对象是不合情理的.例如,动物作为一个基类可以派生出老虎.孔雀等子类,但动物本身生成对象明显不合常理.

C++ 虚函数&amp;纯虚函数&amp;抽象类&amp;接口&amp;虚基类(转)

http://www.cnblogs.com/fly1988happy/archive/2012/09/25/2701237.html 1. 多态 在面向对象语言中,接口的多种不同实现方式即为多态.多态是指,用父类的指针指向子类的实例(对象),然后通过父类的指针调用实际子类的成员函数. 多态性就是允许将子类类型的指针赋值给父类类型的指针,多态是通过虚函数实现的. 多态可以让父类的指针有“多种形态”,这是一种泛型技术.(所谓泛型技术,就是试图使用不变的代码来实现可变的算法). 2. 虚函数 2.1

什么是C++虚函数、虚函数的作用和使用方法

我们知道,在同一类中是不能定义两个名字相同.参数个数和类型都相同的函数的,否则就是“重复定义”.但是在类的继承层次结构中,在不同的层次中可以出现名字相同.参数个数和类型都相同而功能不同的函数.例如在例12.1(具体代码请查看:C++多态性的一个典型例子)程序中,在Circle类中定义了 area函数,在Circle类的派生类Cylinder中也定义了一个area函数.这两个函数不仅名字相同,而且参数个数相同(均为0),但功能不同,函数体是不同的.前者的作用是求圆面积,后者的作用是求圆柱体的表面积

C++虚函数和虚函数表

前导 在上面的博文中描述了基类中存在虚函数时,基类和派生类中虚函数表的结构. 在派生类也定义了虚函数时,函数表又是怎样的结构呢? 先看下面的示例代码: 1 #include <iostream> 2 3 using namespace std; 4 5 class A 6 { 7 public: 8 virtual void funcA(){ cout<<"A"<<endl; } 9 }; 10 11 class B 12 { 13 public:

虚函数、纯虚函数、虚函数与析构函数

一.虚函数 只有用virtual声明类的成员函数,使之成为虚函数,不能将类外的普通函数声明为虚函数.因为虚函数的作用是允许在派生类中对基类的虚函数重新定义.所以虚函数只能用于类的继承层次结构中. 一个成员函数被声明为虚函数后,在同一类族中的类就不能再定义一个非virtual的但与该虚函数具有相同的参数(包括个数和类型)和函数返回值类型的同名函数. 根据什么考虑是否把一个成员函数声明为虚函数? ①  看成员函数所在的类是否会作为基类 ② 看成员函数在类的继承后有无可能被更改功能,如果希望更改其功能