子类重写父类虚函数,父类虚函数会变吗
时间: 2023-08-29 11:11:49 浏览: 65
当子类重写(override)父类的虚函数时,父类的虚函数本身不会变化。父类的虚函数仍然是原来的定义,但是通过子类对象调用该虚函数时,实际执行的是子类中重写的版本。这是因为在运行时,通过父类指针或引用指向子类对象时,会根据实际对象的类型去调用相应的函数。这种行为被称为多态性。所以父类的虚函数在子类重写后,可以实现不同的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [子类(虚函数,非虚函数)重写父类的函数(虚函数,非虚函数)等4种情况下的输出](https://blog.csdn.net/qq_43625764/article/details/103294093)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
相关问题
c 子类重写父类虚函数
在C++中,子类可以重写父类的虚函数。为了实现函数的重写,子类需要继承父类,并在子类中使用相同的函数名和参数列表重新定义虚函数。
下面是一个示例代码:
```cpp
#include <iostream>
class Parent {
public:
virtual void display() {
std::cout << "This is the parent class." << std::endl;
}
};
class Child : public Parent {
public:
void display() override {
std::cout << "This is the child class." << std::endl;
}
};
int main() {
Parent* ptr = new Child(); // 创建子类对象的基类指针
ptr->display(); // 调用子类重写的虚函数
delete ptr;
return 0;
}
```
在上述代码中,Parent类中的display()函数被声明为虚函数,Child类继承自Parent类,并重写了display()函数。在main函数中,创建了一个Child类对象的Parent类指针,然后通过调用ptr->display()来调用子类重写的虚函数。
运行上述代码将输出:
```
This is the child class.
```
可以看到,子类重写了父类的虚函数,实现了运行时多态性。
如果父类不使用虚函数,那么子类能重写父类的函数吗
如果父类没有将需要被子类重写的函数声明为虚函数,那么子类就不能通过重写该函数来改变其行为。在没有使用虚函数的情况下,父类的函数实现会被子类继承,但子类无法在不修改父类源代码的情况下改变该函数的行为。
如果你想在不使用虚函数的情况下允许子类修改函数的行为,可以使用模板方法模式。该模式可以在父类中定义一个模板方法,该方法调用一系列抽象方法,然后在子类中重写这些抽象方法以实现自定义行为。
以下是一个使用模板方法模式的示例:
```cpp
class Parent {
public:
void doSomething() {
// 调用抽象方法
doSomethingImpl();
}
protected:
// 定义抽象方法
virtual void doSomethingImpl() = 0;
};
class Child : public Parent {
protected:
void doSomethingImpl() override {
// 子类的实现
}
};
```
在上面的示例中,`Parent` 类定义了一个模板方法 `doSomething()`,该方法调用了抽象方法 `doSomethingImpl()`。在 `Child` 类中,重写了 `doSomethingImpl()` 方法以实现自定义行为。这样,即使 `Parent` 类中的 `doSomething()` 方法没有被声明为虚函数,`Child` 类也能修改其行为。