c++ 类名直接访问非静态函数?

简介: c++ 类名直接访问非静态函数?

今天看代码时,看到类似下面的代码,在Sub类InitSub函数中有一句 Base::Init();,以为C++语言可以直接使用类名调用非静态函数?当时有点想不通。

#include <iostream>
class Base{
public: 
  void Init() {
    std::cout<< "Init Base" << std::endl;
  }
};
class Sub : public Base {
public:
  void InitSub() {
        Base::Init(); // 使用类名调用了非静态函数?
    }
};
int main(){
    Sub sub;
    sub.InitSub();
    //Base::Init();
    return 0;
}

然后我就把  Base::Init(); 直接放到 main 函数中,果然编译不过,提示“ 不能在没有对象的情况下调用成员函数 ‘void Base::Init()’ ”,如下图

2018122814580746.png

所以,C++语言目前时无法用类名直接访问非静态的类成员函数的,那么为什么在 类Sub 中可以使用 Base::Init(); 呢?这里是使用来  Base::  类名作用域来指明 Init 函数的是Base里面的函数,假设 类Sub 也有 Init() 函数的话,那么运行时就会调用到 类Sub 的,这里显示指明使用 类Base 的 Init() 函数。


目录
相关文章
|
6月前
|
设计模式 存储 uml
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
69 1
|
6月前
|
设计模式 安全 算法
【C++ 基础】超越边界:C++中真正不受访问修饰符限制的特性
【C++ 基础】超越边界:C++中真正不受访问修饰符限制的特性
59 0
|
6月前
|
数据安全/隐私保护 C++
c++访问
c++访问
46 0
|
12天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
35 4
|
3月前
|
编译器 C++
virtual类的使用方法问题之静态和非静态函数成员在C++对象模型中存放如何解决
virtual类的使用方法问题之静态和非静态函数成员在C++对象模型中存放如何解决
|
2月前
|
JavaScript 前端开发 Java
通过Gtest访问C++静态、私有、保护变量和方法
通过Gtest访问C++静态、私有、保护变量和方法
72 0
|
5月前
|
存储 数据安全/隐私保护 C++
C++一分钟之-C++中的静态成员与静态函数
【6月更文挑战第20天】在C++中,静态成员(变量&函数)打破对象实例化规则,提供类级共享。静态变量独占一份,用于计数或共享配置,需类外初始化,注意访问权限。静态函数不依赖对象,直接通过类名调用,不使用`this`指针,适合工具函数或操作静态变量。示例展示了静态成员的使用,强调了理解和避免常见问题的重要性。
54 4
|
6月前
|
C++
C++中使用namespace关键字定义和访问命名空间的技术性探讨
C++中使用namespace关键字定义和访问命名空间的技术性探讨
46 3
|
6月前
|
C++
C++ 类的访问修饰符:深入解析
C++ 类的访问修饰符:深入解析
57 1
|
6月前
|
C++
C++程序中的派生类成员访问属性
C++程序中的派生类成员访问属性
55 1