接口在C+中是一种良好的实践吗+;? 来自一个Java或Python世界,几乎没有或没有C++经验,我习惯于用接口来分离一个类从它的实现中起的作用,为了java和P. 我不打算去分析java中接口的所有好处,或者为什么它们被引入(缺少多重继承),而C++中不需要。 我还发现了如何使用 我的问题更多的是关于这是否是C++环境中的一个好的实践。

接口在C+中是一种良好的实践吗+;? 来自一个Java或Python世界,几乎没有或没有C++经验,我习惯于用接口来分离一个类从它的实现中起的作用,为了java和P. 我不打算去分析java中接口的所有好处,或者为什么它们被引入(缺少多重继承),而C++中不需要。 我还发现了如何使用 我的问题更多的是关于这是否是C++环境中的一个好的实践。,c++,C++,据我所知,如果没有纯虚拟方法,就不可能有接口的等价物。这意味着在C++中引入接口将在代码中引入一些开销(因为虚拟方法)。 因此,基于纯虚拟方法的接口是一件好事吗?是否有其他方法可以实现我不知道的Liskov替换原则和依赖注入?可能使用模板 例如,谷歌测试,但提出了一种方法 我试图弄清楚我的编码习惯在我的新C++环境中是否仍然是相关的,或者我是否应该适应和改变我的范式。 [根据答案和评论进行编辑] 我得到了我一直在寻找的部分答案(即“是/否,有争论”),我想我应该进一步澄清我仍在试图弄清楚的问题

据我所知,如果没有纯虚拟方法,就不可能有接口的等价物。这意味着在C++中引入接口将在代码中引入一些开销(因为虚拟方法)。 因此,基于纯虚拟方法的接口是一件好事吗?是否有其他方法可以实现我不知道的Liskov替换原则和依赖注入?可能使用模板

例如,谷歌测试,但提出了一种方法

我试图弄清楚我的编码习惯在我的新C++环境中是否仍然是相关的,或者我是否应该适应和改变我的范式。 [根据答案和评论进行编辑]

我得到了我一直在寻找的部分答案(即“是/否,有争论”),我想我应该进一步澄清我仍在试图弄清楚的问题

  • 除了使用类似接口的设计来进行依赖项注入,还有其他方法吗
  • 相反的问题:一个人是否应该决定采用基于接口的设计,除非速度绝对至关重要,什么时候才能采用基于纯虚拟方法的接口
注:

  • 我想我是想弄清楚我在界面方面的思维是否过于狭隘(因此我的编辑在寻找替代方案)
  • 我在C++ 11环境下工作

,我认为接口仍然是C++中的一个很好的实践。虚拟方法所带来的开销是最小的,正如您将反复听到的,过早优化是一个很大的错误。抽象基类是C++中一个众所周知的、很容易理解的概念,它有助于在复杂的模板元编程上有可读的、通用的概念。 也就是说,我会尽量避免多重继承。它会带来一些棘手的问题,这就是为什么Java明确禁止它用于常规继承。一个简单的谷歌搜索可以给你更多的解释

如果您有多个不相关的类,并且希望在每个类上调用相同名称的方法(比如
foo()
),那么您可以创建一个模板化函数来代替接口

A类{
void foo(){
//做点什么
}
};
B类{
void foo(){
//做点什么
}
};
模板
void callFoo(常量T和对象){
object.foo();
}
int main(){
A A;
B B;
callFoo(a);
callFoo(b);
返回0;
}
即使
callFoo()
中没有明确的“约定”说明类型必须支持
.foo()
,但传递给它的任何对象都必须支持它,否则将出现编译错误。这是在编译时躲避类型对象的常用方法,也是某些场景中接口的替代方法


在结束时,随着你学习更多的C++,你将用自己的判断来决定你将如何完成你想要的多态行为。没有一个单一的正确答案,就像没有错误的答案一样。抽象基类和模板duck类型都是很好的工具,它们的用途略有不同。

取决于您所做的工作。C++是多种方式进行多态性,包括链接时间多态性。接口是C++中的一个好的实践吗?YESeFutices是设计首选,最重要的是在C++中用纯抽象基类进行仿真。你甚至可以,尽管这是一个很难注意到的微观优化。它不会比您的Java代码慢,您还没有找到@admins,为什么要搁置它并停止接受答案呢?这是一个很好的开放式问题,这样的讨论可以让很多人受益。从一开始就选择正确的和过早优化是两件完全不同的事情。如果你不想要编译时多态性,那么仅仅为了避免过早的优化而使用运行时多态性是不好的。我只是说你不应该仅仅因为虚拟方法“慢”就避免它们。啊,好吧,也许我只是误读了。一旦决定使用运行时多态性,就不应该太担心虚拟方法的开销,我完全同意这一点,这还为时过早