`
lunan
  • 浏览: 78847 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C++中的多态、虚函数、父类子类

    博客分类:
  • C++
阅读更多
/*
C++中的多态、虚函数、父类子类

1、 如果你期望衍生类别重新定义一个成员函数,那么你应该在基础类别中把此函 数设为virtual。
2、以单一指令唤起不同函数,这种性质称为Polymorphism,意思是"the ability to  assume many forms",也就是多态。
3、既然抽象类别中的虚拟函数不打算被调用,我们就不应该定义它,应该把它设为纯虚拟函数(在函数声明之后加上"=0" 即可)
4、抽象类别不能产生出对象实体,但是我们可以拥有指向抽象类别之指针,以便于操作抽象类别的各个衍生类别。
虚拟函数衍生下去仍为虚拟函数,而且可以省略virtual 关键词。
*/

#include "stdafx.h"
#include <iostream> 

using namespace std; 

class A

public: 
virtual void Serialize() { cout<<"A::Serial() //n";  }    
}; 

class B: public A

public : 
int m_data1 ; 
void func()

cout<<"B::func()"<<endl; 
Serialize(); 


virtual void Serialize() { cout<<"B::Serial() //n";  } 
void OutputName(){  cout<<"B /n/n";  }
}; 

class C : public B

public: 
int m_data2; 
virtual void Serialize(){  cout<<"C::Serialize() //n";  } 
void OutputName(){ cout<<"C /n/n";  }
}; 

int main(void){ 

C myDoc ; 
C* pMyDoc = new C(); 

cout<<"#1 testing"<<endl; 
myDoc.func(); 
   
//由于子类C中已经重写了父类的Serialize(),所以都会最终落实到对子类C::Serialize()的调用
cout<<"#2 testing"<<endl; 
((B*)(&myDoc))->func(); 

cout<<"#3 testing"<<endl; 
pMyDoc->func(); 

//这里直接把C类型对象upcast强制转化为了B类型对象(对象切割)。
cout<<"#4 testing"<<endl; 
((B)myDoc).func(); 
   
//虚函数 调用
A* array[]={ 
new A(), 
new B(), 
new C() 
}; 
int arraySize = sizeof(array)/sizeof(*array[0]);    //3 
cout<<arraySize<<endl;               

for(int i=0 ; i < arraySize ; i++) 
array[i]->Serialize(); 


B* cb;
C cc;

cb = &cc;
cb->OutputName();
cc.OutputName();

return 0;  

分享到:
评论

相关推荐

    C++多态虚函数表

    ### C++多态虚函数表详解 #### 一、多态的基本概念与内存分布 在C++中,多态是一种让程序可以根据不同的上下文表现出不同行为的重要机制。它允许我们使用基类类型的指针或者引用指向派生类的对象,从而在运行时...

    C++多态虚表分析图解

    具体来说,多态是指通过父类类型的指针或引用可以调用其子类中的成员函数的能力。这种能力使得父类指针能够具有“多种形态”。 例如,假设有一个基类`Base`和一个派生类`Derived`,其中`Derived`继承自`Base`。如果...

    c++多态和虚函数表

    ### C++多态技术详解 #### 一、引言 多态(polymorphism)作为面向对象编程中的核心概念之一,在C++中具有重要的地位。它指的是一个接口可以在多个不同的类中实现不同功能的能力。在C++中,多态可以通过动态多态和...

    C++中的虚函数表图解

    总结来说,C++的虚函数表是实现多态的关键,它存储了类中虚函数的指针,使得通过父类指针可以调用到子类的成员函数。理解和利用虚函数表可以帮助我们更深入地理解C++的多态机制和内存布局,但在实际编程中,我们通常...

    C++面向对象技术完全剖析_源代码(继承,封装,多态,虚函数,纯虚函数,虚拟继承,多重继承,函数重载,指针……)

    要求:1、虚函数 多态 多态表现为 基类 基类指针和继承间的关系 2、带有多对象成员。定义 3、体现继承 虚拟继承(要通过至少三层 父类父类子类) 虚函数 (3层 纵向关系) 水平方向上:体现出继承顺序 先虚拟继承 ...

    C++ 多态 虚表 分析 图解 .doc

    C++ 中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技 术可以让父类的指针有“多种形态”,这是一种泛型技术...

    C++ 虚函数表详解

    在无覆盖的情况下,虚函数表中包含了父类的虚函数的地址,而在有覆盖的情况下,虚函数表中包含了子类的虚函数的地址。 虚函数表是C++中实现多态机制的关键组件,用于存储类的虚函数的地址,解决继承和覆盖的问题。 ...

    深入解析C++中的虚函数与多态

    1.C++中的虚函数C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是...

    虚函数、多态、动态联编

    例如,当你有一个指向基类的指针,但实际指向的是一个子类的对象,调用虚函数时,会执行子类中重写过的版本,而不是基类的版本。这种机制在设计模式、接口实现和类层次结构中非常常见。 多态分为静态多态(编译时...

    C++中的虚函数表机制

    在C++中,虚函数是实现多态性的重要机制,多态允许我们使用父类类型的指针或引用来调用子类中重写的成员函数。虚函数表(Virtual Table,简称V-Table)是C++编译器用来支持动态绑定(也称运行时绑定)的关键构造,它...

    经典c/c++多态实例

    在C/C++中,多态性主要通过虚函数(Virtual Functions)和纯虚函数(Pure Virtual Functions)来实现,这两者都是在基类中定义的,允许子类进行重写,从而达到行为上的多样性。 1. 虚函数:在C++中,虚函数是通过在...

    详细讲述c++虚函数实现

    多态是C++泛型编程的一种体现,它允许我们使用统一的接口处理不同类型的对象,如模板、RTTI(Run-Time Type Information)和虚函数都是实现多态的方式。 虚函数的实现依赖于虚函数表(Virtual Table,简称V-Table)...

    虚函数的使用技巧.rar_C++虚函数_虚函数

    虚函数使得子类能够重写父类的方法,从而在运行时根据对象的实际类型调用正确的方法,而不是编译时的类型。下面将详细探讨虚函数的使用技巧。 1. **虚函数声明**: 在C++中,通过在函数声明前加上`virtual`关键字...

    虚函数是C++中用于实现多态(polymorphism)的机制

    ### C++中的虚函数及其实现多态的机制 #### 一、虚函数的概念与作用 在C++中,虚函数是一种特殊类型的成员函数,它的主要目的是实现多态性(polymorphism)。多态性允许子类重写父类的方法,并且能够在运行时根据...

    虚函数虚表的详解,大家看看!

    在继承体系中,如果子类没有重载父类的虚函数,子类的虚函数表将包含父类的虚函数,并在其后添加子类自己的虚函数。这样,无论通过基类还是子类的指针调用虚函数,都会根据对象的实际类型找到正确的函数实现,实现了...

    类的多态练习_C++_类的多态练习_

    `override`关键字是C++11引入的,用来明确表示子类函数是覆盖父类的虚函数,可以避免因函数签名不匹配导致的错误。 此外,C++11还引入了`final`关键字,可以防止子类进一步覆盖某个虚函数,确保特定的函数实现不会...

Global site tag (gtag.js) - Google Analytics