如果不定义虚函数子类直接引用父类的成员函数有什么问题成员函数
时间: 2024-03-30 14:38:14 浏览: 41
如果不定义虚函数,子类直接引用父类的成员函数时,将会发生静态绑定,即编译器在编译时就决定了要调用的函数是哪一个,而不是在运行时动态地根据对象类型来判断调用哪一个函数。
这意味着,如果子类重写了父类的成员函数,但没有定义为虚函数,那么当基类指针或引用指向派生类对象时,调用的仍然是基类中的函数,而不是派生类中的函数。这将导致无法实现多态性,也就无法充分发挥面向对象编程的优势。
因此,如果想要实现运行时多态性,必须将基类中需要重写的成员函数定义为虚函数。这样,当基类指针或引用指向派生类对象时,就可以根据对象的实际类型来调用对应的派生类函数,实现多态性。
相关问题
c++子类怎么强制覆盖父类的非虚成员函数
在C++中,我们可以使用`override`关键字来强制子类覆盖父类的虚函数,但是非虚函数是不能被重写的。不过,你可以在子类中定义一个同名的函数来隐藏父类的同名函数。为了强制子类覆盖父类的非虚函数,你可以使用`virtual`关键字来将父类的函数声明为虚函数,然后在子类中覆盖它。
例如,假设父类有一个非虚函数`foo()`:
```
class Parent {
public:
void foo() {
// 父类foo()的实现
}
};
```
你可以在子类中定义一个同名的函数来隐藏它:
```
class Child : public Parent {
public:
void foo() {
// 子类foo()的实现
}
};
```
但是这只是隐藏了父类的同名函数,而不是覆盖它。如果你想强制子类覆盖父类的非虚函数,你可以将父类的函数声明为虚函数:
```
class Parent {
public:
virtual void foo() {
// 父类foo()的实现
}
};
```
现在,子类必须使用`override`关键字来覆盖父类的虚函数:
```
class Child : public Parent {
public:
void foo() override {
// 子类foo()的实现
}
};
```
这样,如果子类没有实现`foo()`函数,编译器将会报错。
父类非静态成员函数如何调用子类非静态成员函数
父类中无法直接调用子类的非静态成员函数。但是,如果子类中定义了与父类中同名的非静态成员函数,那么在子类对象上调用该成员函数时,会优先调用子类的同名成员函数,而不是父类的同名成员函数。如果您想要在父类中调用子类的非静态成员函数,可以通过将父类中的成员函数声明为虚函数来实现。这样在子类中重写该虚函数后,可以通过父类指针或引用调用子类的同名成员函数。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)