- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个接口(interface)的三种不同实现(求解方程组)。旧接口(interface)本质上是一个类中的 void foo(int *f)
。现在我想将其推广到我同时解决 N
系统的情况。为此,我想要接口(interface) void foo(int *f[N]
).
在代码库中有一个定义接口(interface)的抽象类,然后从该类派生出三个类。我想在不破坏现有代码的情况下添加我的概括。因此我想到了添加新接口(interface)并将旧接口(interface)委托(delegate)给新接口(interface)。这是我的压缩版本:
#include <iostream>
struct AbstractClass {
/// Old interface, needs to be retained.
virtual void foo(int *f) {
std::cout << "AbstractClass::foo(int *f)\n";
int *a[2] = {f, nullptr};
foo(a);
}
/// New interface.
virtual void foo(int *f[2]) {
std::cout << "AbstractClass::foo(int *f[2])\n";
}
};
struct Derived : public AbstractClass {
/// New interface.
void foo(int *f[2]) override {
std::cout << "Derived::foo(int *f[2])\n";
}
};
int main(int argc, char **argv) {
// Code using the old interface.
Derived d;
int *a;
d.foo(a);
}
我希望 d.foo(a)
的调用会转到继承的 Derived::foo(int *f)
并从那里转到 派生::foo(int *f[2])
。但是,g++
6.3 为我提供了以下内容(在 C++11 模式下):
inheritance-test.cpp: In function 'int main(int, char**)':
inheritance-test.cpp:31:12: error: no matching function for call to 'Derived::foo(int*&)'
d.foo(a);
^
inheritance-test.cpp:21:10: note: candidate: virtual void Derived::foo(int**)
void foo(int *f[2]) override {
^~~
inheritance-test.cpp:21:10: note: no known conversion for argument 1 from 'int*' to 'int**'
看起来派生对象并没有真正继承我想要的方法。
不过,使用带有指向基类指针的运行时多态性确实有效:
AbstractClass *pd = new Derived();
int *a = nullptr;
pd->foo(a);
delete pd;
我真的不明白为什么没有指针它就不能工作。 vtable 没有使用自动存储,因为函数调用在编译时绑定(bind)(早期绑定(bind))?
这让我离解决方案更近了一点,但我仍然需要接触使用该库的所有代码。然而,这并不是一个真正的选择,旧的东西必须继续工作。
我能做些什么(除了复制所有代码)?将此委托(delegate)复制到每个派生类中就足够了吗?
最佳答案
有一种叫做 name hiding 的东西在 C++ 中。基本上,当您重写派生类中的成员函数时,它会隐藏基类中发现的所有其他重载。
这就是下面失败的原因:
Derived d;
int *a;
d.foo(a);
下面的作品:
AbstractClass *pd = new Derived();
int *a = nullptr;
pd->foo(a);
因为带指针的foo
重载在AbstractClass
中,但隐藏在Derived
中。
您可以使用 using
使这些重载可见。
struct Derived : public AbstractClass {
using AbstractClass::foo;
void foo(int *f[2]) override {
std::cout << "Derived::foo(int *f[2])\n";
}
};
关于c++ - 仅在使用间接时调用虚函数——经典的早期绑定(bind)问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42588493/
我正在为从 API 级别 8 到 14 的 android 开发一个应用程序。我正在尝试在早期版本中获得与 android 4(请参阅联系人应用程序)相同的快速滚动行为(右侧固定的时尚滚动条)边)。有
早期(编译期)优化 jvm的编译器可以分为三个编译器: 前端编译器:把*.java转变为*.class的过程。如sun的javac、eclipse jdt中的增量式编译器(ecj)
苹果终于推出了所谓的auto-renewable subscriptions昨天。由于我在应用内购买方面的经验很少(仅限沙盒),所以我不确定我在这里是否一切顺利。似乎需要对收据进行服务器端验证。找出订
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 要求代码的问题必须表明对正在解决的问题的最低理解。包括尝试的解决方案、它们为什么不起作用以及预期结果。另
在 Wagner 的“Effective C#”第 23 项中,他解释说 interface methods are not virtual...they are a declaration of a
我最近遵循了本指南 Installing a Git Server using Apache (WebDAV) on Ubuntu Server 12.04使用 Apache (WebDAV) 设置本
这是我之前的问题 jQuery UI hiding not taking effect for early DOM elements 的后续问题。我几乎刚刚编辑了那个,但不想使 the accepte
我正在尝试替换 ZonedDateTime.toInstant方法,因为它仅从 API 26 for Android 开始可用。 但我的应用程序应该支持 API 19。 我想将 ZonedDateTi
我的电脑正确配置了 SSH,我在尝试克隆存储库时遇到了这个错误: 我运行这个命令来克隆存储库 git clone ssh://git-codecommit.us-west-2.amazonaws.co
我是一名优秀的程序员,十分优秀!