私有虚函数

#include<iostream>
using namespace std;
class base
{
private:
    virtual void func(){cout<<"base : func()"<<endl;}
};
class derived :public base
{
public:
    virtual void func(){cout<<"derived :func()"<<endl;}
};
int main()
{
    derived d;
    base *pbase=&d;
    pbase->func();
    return 0;
}

编译出错的原因是,func 是 base 的私有成员。即使运行到此时实际上调用的应该是 derived 的共有成员 func() 也不行,因为语法检查是不考虑运行结果

如果将 base 中的private 换成 public ,即使 derived 中的func () 是private 的,编译依然能通过,也能正确调用 derived ::func(), 派生类的虚函数的访问权限不影响虚函数的动态联编,也就是多态与成员函数的访问权限并没有什么关系。基类定义了虚函数,并且是 public ,那么派生类只要 override 虚函数无论放在什么样的访问权限下,都以基类的访问权限为主。

2 非共有虚函数

派生类通过覆盖基类共有虚函数的方式实现多态是最常见的情况,指向派生类对象的基类指针调用被派生类覆盖的函数,实际上是调用的是派生类的函数

从表面上看,虚函数的作用就是为了使父类指针能够访问到派生类对象的函数。通过基类指针或引用调用成员函数时,不论成员函数的可见性如何,如果该函数是非虚拟的,那么将采用静态绑定,即编译时绑定;如果该函数是虚拟的 则采用动态绑定,即运行时绑定。

#include<iostream>
using namespace std;
class base
{
private:
    virtual void func2(){cout<<"base : func2()"<<endl;}
public:
    void func1()
    {
        func2();
    }
};
class derived :public base
{
private:
    virtual void func2(){cout<<"derived :func2()"<<endl;}
};
int main()
{
     base *p=new derived();
     p->func1();
     delete p;
    return 0;
}

上述例子中,基类func2 被声明为virtue private,声明为private 表示基类不想让派生类看到这个函数,但又声明为virtue,表示基类想让这个函数实现多态。意思是,派生类既可以修改这个实现,也可以继承其默认的实现。所以,基类中有一个虚拟私有成员函数,表示这是一个可以被派生类修改的实现细节。

原文地址:https://www.cnblogs.com/guoyu1024/p/9058099.html

时间: 2024-10-27 06:35:09

私有虚函数的相关文章

C++对象内存分布(1) - 私有虚函数

1.前言 本篇文章的所有代码例子,如果是windows上编译运行,则使用的是visual studio 2013.如果是RHEL6.5平台(linux kernal: 2.6.32-431.el6.i686)上编译运行,则其gcc版本为4.4.7,如下所示: [[email protected] ~]# gcc --version gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4) 2.非公有虚函数 在开始探讨对象中内存的具体分布之前,先来看下C++中虚函数的一

C++中虚函数的理解,以及简单继承情况下的虚函数的表!

面向对象的三大特征=封装性+继承性+多态性 封装=将客观事物抽象成类,每个类对自身的数据和方法实行权限的控制 继承=实现继承+可视继承+接口继承 多态=将父类对象设置成为和一个或者更多它的子对象相等的技术, 用子类对象给父类对象赋值之后, 父类对象就可以根据当前赋值给它的子对象的特性一不同的方式运作 C++的空类有哪些成员函数 1.缺省构造函数 2.缺省拷贝构造函数 3.缺省析构函数 4.缺省赋值运算符 5.缺省取址运算符 6.缺省取址运算符const PS:只有当实际使用的时候才会去使用这些类

关于虚函数的那些事儿

一.虚函数定义 在某基类中声明为virtual 并在一个或多个派生类中被重新定义的成员函数,用法格式为: virtual 函数返回类型 函数名(参数表) {函数体}; 虚函数是C++语言实现运行时多态的唯一手段,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数. 举个例子: class A{ public:virtual void p() { cout << "A" << endl; } }; class B : public A { public:

C++多态性与虚函数

面向对象程序设计中的多态性是指向不同的对象发送同一个消息,不同对象对应同一消息产生不同行为.在程序中消息就是调用函数,不同的行为就是指不同的实现方法,即执行不同的函数体.也可以这样说就是实现了"一个接口,多种方法". 从实现的角度来讲,多态可以分为两类:编译时的多态性和运行时的多态性.前者是通过静态联编来实现的,比如C++中通过函数的重载和运算符的重载.后者则是通过动态联编来实现的,在C++中运行时的多态性主要是通过虚函数来实现的. 赋值兼容     不过在说虚函数之前,先介绍一个有关

C++之多态性与虚函数

面向对象程序设计中的多态性是指向不同的对象发送同一个消息,不同对象对应同一消息产生不同行为.在程序中消息就是调用函数,不同的行为就是指不同的实现方法,即执行不同的函数体.也可以这样说就是实现了“一个接口,多种方法”. 从实现的角度来讲,多态可以分为两类:编译时的多态性和运行时的多态性.前者是通过静态联编来实现的,比如C++中通过函数的重载和运算符的重载.后者则是通过动态联编来实现的,在C++中运行时的多态性主要是通过虚函数来实现的,也正是今天我们要讲的主要内容. 1.不过在说虚函数之前,我想先介

C++如何处理内联虚函数

http://blog.csdn.net/hedylin/article/details/1775556 当一个函数是内联和虚函数时,会发生代码替换或使用虚表调用吗? 为了弄清楚内联和虚函数,让我们将它们分开来考虑.通常,一个内联函数是被展开的. class CFoo { private: int val; public: int GetVal() { return val; } int SetVal(int v) { return val=v; } }; 这里,如果使用下列代码: CFoo x

初学C++之虚函数及抽象类

一.虚函数 在同一类中是不能定义两个名字相同.参数个数和类型都相同的函数的,否则就是“重复定义”.但是在类的继承层次结构中,在不同的层次中可以出现名字相同.参数个数和类型都相同而功能不同的函数.而虚函数的作用,就是让我们在基类和派生类中调用同名函数. 在程序中不是通过不同的对象名去调用不同派生层次中的同名函数,而是通过指针调用它们. 举个例子: 假如我们定义了一个基类Shape class Shape { public: void area(); Shape()=default; Shape(i

c++ virturn function -- 虚函数

pure irtual function  -- 纯虚函数 先看例子 #include <iostream> using namespace std; class Polygon { protected: int width, height; public: void set_values (int a, int b) { width=a; height=b; } virtual int area() = 0 ;//{return 0;} // _vptr.Polygon show difre

[转]C++之多态性与虚函数

面向对象程序设计中的多态性是指向不同的对象发送同一个消息,不同对象对应同一消息产生不同行为.在程序中消息就是调用函数,不同的行为就是指不同的实现方法,即执行不同的函数体.也可以这样说就是实现了“一个接口,多种方法”. 从实现的角度来讲,多态可以分为两类:编译时的多态性和运行时的多态性.前者是通过静态联编来实现的,比如C++中通过函数的重载和运算符的重载.后者则是通过动态联编来实现的,在C++中运行时的多态性主要是通过虚函数来实现的,也正是今天我们要讲的主要内容. 1.不过在说虚函数之前,我想先介