使用不在基 class 中的基 class 指针调用派生 class 函数时出现编译器错误
compiler error on calling derived class function using base class pointer which is not in base class
我正在学习 C++ 虚函数。
#include<iostream>
class Base{
virtual void fun(){
std::cout<<"Base\n";
}
};
class Derived:public Base{
void fun(){
std::cout<<"Derived\n";
}
virtual void fun1(){
std::cout<<"Derived 1 \n";
}
};
int main(){
Base* b=new Derived();
b->fun1();
}
我写了这段代码,但它没有编译。按照动态多态的概念,如果我们创建一个base class 指向derived class 的指针,那么我们就可以调用derived class 的函数,对吗?使用class导出的虚指针,我们可以调用virtualtable中的fun1函数,对吧?
但是为什么这里没有编译呢?
您不能从 class 外部调用任何 Base
或 Derived
成员函数,因为这些函数是 private
。你需要让他们 public
另一个问题:
fun1
不是 Base
的成员,因此您不能通过基 class 指针调用 fun1
。
两种可能的解决方案:
- 在
Base
中声明纯 virtual void fun1() = 0
。 Demo
- 在调用
static_cast<Derived*>(b)->fun1();
之前将 b
转换为 Derived*
。 Demo
您的程序也在泄漏内存。你需要 delete b;
并且当你这样做时它现在只会调用 Base
析构函数(结果是 未定义的行为 )因为你的 Base
没有没有 virtual
析构函数。
virtual ~Base() = default;
然后在 main
:
// ...
delete b;
Demo using the smart pointer std::unique_ptr<Base>
而不是手动 delete
。
我正在学习 C++ 虚函数。
#include<iostream>
class Base{
virtual void fun(){
std::cout<<"Base\n";
}
};
class Derived:public Base{
void fun(){
std::cout<<"Derived\n";
}
virtual void fun1(){
std::cout<<"Derived 1 \n";
}
};
int main(){
Base* b=new Derived();
b->fun1();
}
我写了这段代码,但它没有编译。按照动态多态的概念,如果我们创建一个base class 指向derived class 的指针,那么我们就可以调用derived class 的函数,对吗?使用class导出的虚指针,我们可以调用virtualtable中的fun1函数,对吧?
但是为什么这里没有编译呢?
您不能从 class 外部调用任何 Base
或 Derived
成员函数,因为这些函数是 private
。你需要让他们 public
另一个问题:
fun1
不是 Base
的成员,因此您不能通过基 class 指针调用 fun1
。
两种可能的解决方案:
- 在
Base
中声明纯virtual void fun1() = 0
。 Demo - 在调用
static_cast<Derived*>(b)->fun1();
之前将b
转换为Derived*
。 Demo
您的程序也在泄漏内存。你需要 delete b;
并且当你这样做时它现在只会调用 Base
析构函数(结果是 未定义的行为 )因为你的 Base
没有没有 virtual
析构函数。
virtual ~Base() = default;
然后在 main
:
// ...
delete b;
Demo using the smart pointer std::unique_ptr<Base>
而不是手动 delete
。