gpt4 book ai didi

c++ - C++中虚函数的概念?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:48:07 25 4
gpt4 key购买 nike

看了那么多博客,明白了c++虚函数的使用方法。但是,我仍然不明白为什么我们使用虚函数。你能给我一个真实世界的例子吗,这样我就可以更容易地想象虚函数的实际含义。

最佳答案

需要提及的重要一点是,继承(关键字 virtual 是其基础)不应仅出于代码重用的目的,为此应使用委托(delegate)。

委托(delegate)是指当我们有一个名为 BroadbandConnection 的类和一个名为 connection() 的方法时。然后您的经理说我们要添加加密,因此您创建了一个 BroadbandConnectionWithEncryption 类。您的本能可能是使用继承,然后使新类 BroadbandConnectionWithEncryption 派生自 BroadbandConnection。

缺点是初始类的创建者并未将其设计为继承,因此您需要更改其定义以使方法 connection() 成为虚拟方法,以便您可以在派生类中覆盖其行为。这并不总是理想的。更好的想法是在这里使用委托(delegate)来实现代码重用。

class BroadBandConnection
{
public:
void Connection (string password)
{
//connection code.
}
};

class BroadBandConnectionWithEndcryption
{
public:
void Connection (string password)
{
mbroadbandconnection.Connection(password);
//now do some stuff to zero the memory or
//do some encryption stuff
}

private:
BroadBandConnection mbroadbandconnection;
};

关键字 virtual 用于实现多态性。顾名思义,就是一个物体具有不止一种形式的能力。这种决定将在设计接口(interface)或类时做出。

class IShape
{
virtual void Draw () = 0;
};

class Square
{
void Draw()
{
//draw square on screen
}
};

class Circle
{
void Draw()
{
//draw circle on screen
}
};

我使用 = 0 使 Draw() 成为纯虚拟的。我本可以忽略它并添加一些默认实现。纯虚拟对于没有合理默认实现的接口(interface)是有意义的。

这让我可以做的是将一个 Shape 对象传递给各种方法,它们不需要关心我刚刚给它们的东西。他们只知道我必须提供支持形状自行绘制能力的东西。

IShape* circle = new Circle ();
IShape* square = new Square ();

void SomeMethod (IShape* someShape)
{
someShape->Draw(); //This will call the correct functionality of draw
}

在未来,当人们开始考虑新的形状时,他们可以从 IShape 派生,只要他们为 Draw 实现一些功能即可。他们可以将此对象传递给 SomeMethod。

关于c++ - C++中虚函数的概念?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11126198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com