`

C++ 父类的非虚函数调用虚函数

    博客分类:
  • C++
c++ 
阅读更多
结论为:仍然是调用的虚函数,也就是说,如果是子类的指针调用该非虚函数,该非虚函数调用的仍为子类的虚函数。。。
好绕的一段话有木有……还是直接看运行结果和代码:



#include <iostream>
class A {
public:
	///虚函数
	virtual void  printClassInfo() {
		std::cout << "from class A:指针类型" << typeid (*this).name() << std::endl;
	}

	
	void printEncapulate() {
		
		printClassInfo();
	}

	void printEncapulateForceA() {
		
		A::printClassInfo();
	}

};

class B : public A {
public:
	virtual void  printClassInfo() {
		std::cout << "from class B:指针类型" << typeid (*this).name() << std::endl;
	}
};



void main() {
	B b;
	std::cout << "从非虚函数调用虚函数;\t\t\t\t"; b.printEncapulate();// 还是调用的子类虚函数啊!
	std::cout << "从非虚函数强制调用父类的虚函数;\t\t\t"; b.printEncapulateForceA();//强制调用父类虚函数,但类型信息没有丢失
	A* pB = &b;
	std::cout << "子类指针转为父类指针后;\t从非虚函数调用虚函数;\t";  pB->printEncapulate();//指针转为父类不会丢失类型信息

	A a = b;
	std::cout << "子类赋值给父类后;\t从非虚函数调用虚函数;\t"; a.printEncapulate();//赋值给父类变量,子类信息丢失

	A& aa = b;
	std::cout << "子类转为父类引用;\t从非虚函数调用虚函数;\t";  pB->printEncapulate();//指针转为父类引用,其实和指针等效,不会丢失类型信息
}

  • 大小: 16.8 KB
分享到:
评论

相关推荐

    c++中子类对象不能调用父类中的虚函数

    在C++编程语言中,`...理解子类对象不能直接调用父类虚函数这一概念,有助于避免编程中的常见错误,并能更好地利用C++的面向对象特性。在实际编程中,应始终通过基类指针或引用调用虚函数,以确保多态性的正确行为。

    c++虚函数使用

    C++ 虚函数使用 C++ 虚函数是实现多态机制的主要手段。多态机制允许使用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这是一种泛型技术,旨在使用不变的代码来实现可变的算法。 ...

    C++中的虚函数表图解

    在C++中,虚函数是实现多态性的重要...理解和利用虚函数表可以帮助我们更深入地理解C++的多态机制和内存布局,但在实际编程中,我们通常使用C++的语法特性,如基类指针调用虚函数,来实现多态,而非直接操作虚函数表。

    深入探讨C++父类子类中虚函数的应用

    本文将深入探讨C++父类子类中虚函数的应用,以帮助读者更好地理解和使用这一特性。 首先,我们要明确一个基本概念:在C++中,当一个基类指针或引用指向派生类对象时,如果调用的是非虚函数,那么将始终调用基类的...

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

    在没有覆盖父类虚函数的情况下,子类的虚函数表会包含父类的虚函数指针,而子类新增的虚函数则添加到表的后面。如果有覆盖,子类的虚函数表将替换掉相应父类的虚函数指针,确保调用到的是子类的实现。 例如,如果有...

    C++类继承之子类调用父类的构造函数的实例详解

    C++类继承之子类调用父类的构造函数的实例详解 C++类继承是一种重要的面向对象编程技术,通过继承可以实现代码的重用和模块化。在C++类继承中,子类可以继承父类的成员变量和成员函数,但是在子类中调用父类的构造...

    C++ 虚函数表详解

    虚函数表(Virtual Table,简称V-Table)是一种机制,用于存储类的虚函数的地址,解决继承和覆盖的问题,使得父类的指针可以正确地调用子类的成员函数。 虚函数表的实现机制是通过在对象实例的内存中分配一个表,这...

    构造函数不能声明为虚函数的原因及分析

    1. 从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道...虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数。而构造函数是在创建对象时自动调用的,不可能通

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

    虚函数调用相比非虚函数会稍慢,因为需要在运行时查找虚函数表。但在大多数情况下,这种性能差异可以忽略不计。 通过理解并熟练应用这些技巧,可以充分利用C++的多态性,编写出更加灵活和可扩展的代码。虚函数是...

    C++虚函数表实现聚合(COM)

    当通过基类指针调用虚函数时,编译器会使用这个表来找到正确的函数实现。 COM(Component Object Model)是微软提出的一种组件模型,它也利用了C++的虚函数表机制来实现接口的多态性。COM对象可以被视为具有多个...

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

    这样,无论通过基类还是子类的指针调用虚函数,都会根据对象的实际类型找到正确的函数实现,实现了多态调用。 如果子类重写了父类的虚函数,子类的虚表会将被覆盖的虚函数替换为子类的版本,而其他未被覆盖的虚函数...

    C++实验六 多态性和虚函数的应用 课程 实验报告

    在C++中,通过虚函数实现动态绑定,使得基类指针或引用可以调用派生类的成员函数。 五、类的设计与对象创建 实验6.2展示了如何设计更复杂的类层次结构。`Person`类作为基础,包含`name`和`age`属性;`Student`类...

    c++ 对比虚函数的动态绑定

    当通过基类指针调用虚函数时,实际上是在查找并调用虚函数表中对应条目的函数,这样就能确保调用到的是实际对象所属类的版本。 ### 示例代码解析 在给出的代码片段中,定义了两个类:`cbase` 和 `cderive`,其中 `...

    xuhanshu.rar_C++虚函数_虚函数

    1. **效率问题**:由于虚函数涉及到虚函数表查找,调用虚函数相比非虚函数会有一定的性能损失。但在大多数情况下,这种损失是可以接受的。 2. **成员初始化列表**:对于带有虚函数的类,应尽可能在构造函数的成员...

    C++中重载与重写函数区别及虚函数

    当通过基类指针调用虚函数时,编译器会生成指向VTABLE中相应函数地址的代码,而不是直接调用函数。例如,对于`a-&gt;foo();`这样的调用,实际执行的代码类似于: ```cpp (a-&gt;vptr)[1](); ``` 这里`[1]`表示`foo`在...

    C++虚函数表解析

    这样,即使通过基类指针调用虚函数,也能正确地调用到对应派生类的实现。 虚函数表的结构通常如下: 1. 每个类的虚函数表是一个由函数指针组成的数组,每个元素指向一个虚函数的实现。 2. 表的第一个元素通常是析...

    虚函数、多态、动态联编

    这意味着,即使通过父类指针调用虚函数,实际上会执行子类的版本。 总的来说,虚函数、多态和动态联编是C++中强大的工具,它们让代码更具灵活性和扩展性。理解和掌握这些概念对于编写高效、可维护的面向对象程序至...

    C++ 虚函数表解析

    当子类覆盖父类的虚函数时,子类的虚函数表会包含父类虚函数表的副本,并替换需要覆盖的函数地址。这意味着,即使通过基类指针调用,也会执行子类的版本。这种机制使得多态性得以实现,即相同的函数调用可以根据对象...

    C++多态虚函数表

    - 在多重继承的情况下,子类的虚函数表基于父类的虚函数表,可能包括对父类虚函数的重写。 - 使用基类指针调用虚函数时,实际调用的是子类中的实现(如果子类进行了重写)。 通过理解虚函数表的工作原理,我们可以...

Global site tag (gtag.js) - Google Analytics