gpt4 book ai didi

java - C++ 中的覆盖规则

转载 作者:行者123 更新时间:2023-11-30 03:04:19 24 4
gpt4 key购买 nike

从 Java 的角度来看,我惊讶地发现您只能覆盖具有 virtual 关键字的基方法。在 Java 中,您使用 final 关键字来声明一个方法不能被覆盖。

我的想法是,您很少想禁止重写,以便其他人可以按照他们认为合适的方式扩展您的类(class)。

所以在 C++ 中,如果您觉得有人可能想在某个阶段继承您的类(也许多年后有人认为这是一个很酷的想法),您是否将所有方法都设为虚拟方法?

或者是否有一些我不知道的要在 C++ 中禁止这样做的关键原因?

作为引用,这是我在每种语言中所做的实验:

Java

    public class Base {

void doSomething(){
System.out.println("Doing the base thing");
}
}
public class Derived extends Base {

void doSomething(){
System.out.println("Doing the derived thing");
}

public static void main(String... argv){
Base object = new Derived();
object.doSomething();
}
}

C++

    class Base
{
public:
Base(void);
~Base(void);
virtual void doSomething();
};

void Base::doSomething(){
std::cout << "I'm doing the base thing\n" << std::endl;
}

class Derived :
public Base
{
public:
Derived(void);
~Derived(void);
void doSomething();
};

void Derived::doSomething(){
std::cout << "I'm doing the dervied thing" << std::endl;
}


int main(void){

Base * object = new Derived;

object->doSomething();
return 0;

}

最佳答案

duffymo 和 Als 正在为您指引正确的方向。我只想评论你说的一件事:

So in C++ if you feel that someone might want to at some stage inherit from your class (maybe years later someone thinks its a cool idea) do you make all your methods virtual?

从软件工程的角度来看:如果您没有立即使用继承并且没有使用接口(interface),那么我不建议将您的方法声明为虚拟的。

虚拟方法伴随着非常轻微的性能下降。对于非关键代码路径,性能影响可能可以忽略不计。但是对于经常被调用的类方法,它可以累加起来。编译器不能做尽可能多的内联和直接链接。相反,必须在运行时在 v 表数组中查找要调用的虚方法。

当我的编码团队中的某个人开始与“某人稍后可能想要……”的设计对话时,我的“面向 future ”的反模式警报就会响起。为可扩展性而设计是一回事,但“面向 future 的功能”应该推迟到那个时候。

此外 - 多年后认为这是一个很酷的想法的人 - 让他成为拥有将类方法转换为虚拟方法的人。无论如何,到那时您将从事更大的项目。 :)

关于java - C++ 中的覆盖规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8710785/

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