我有一个纯粹的抽象基础和两个派生类:
struct B { virtual void foo() = 0; };
struct D1 : B { void foo() override { cout << "D1::foo()" << endl; } };
struct D2 : B { void foo() override { cout << "D1::foo()" << endl; } };
Run Code Online (Sandbox Code Playgroud)
foo在A点呼叫的成本是否与对非虚拟成员功能的呼叫相同?或者它是否比D1和D2不是从B派生的更昂贵?
int main() {
D1 d1; D2 d2;
std::vector<B*> v = { &d1, &d2 };
d1.foo(); d2.foo(); // Point A (polymorphism not necessary)
for(auto&& i : v) i->foo(); // Polymorphism necessary.
return 0;
}
Run Code Online (Sandbox Code Playgroud)
答案:Andy Prowl …
在C++中我们可以将子类指针转换为父类,但是有没有办法将它转换回来:从父类获得,从子类获得,给孩子类回来?
我的意思是:
class Parent
{
...
};
class Child : public Parent
{
...
};
int main(int argc, char const *argv[])
{
Child* child = new Child();
Parent* parent = child;
Child* old_child = parent; // how to do this??
return 0;
}
Run Code Online (Sandbox Code Playgroud)
谢谢您的回答.
我有多种类型的方法.我想通过编写一个接口来抽象它们,就像我在Java中一样:
public interface Shape {
public float area();
}
class Circle implements Shape {
public float area() {
return radius * radius * Math.PI;
}
public float radius;
}
Run Code Online (Sandbox Code Playgroud)
但是,interfaceRust中没有关键字.Rust不提供抽象多种类型的可能性吗?
说我有这些类ViewA和ViewB
在目标C中使用委托模式我可以做到
@protocol ViewBDelegate{
- (void) doSomething();
}
Run Code Online (Sandbox Code Playgroud)
然后在ViewB界面中:
id<ViewBDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)
然后在ViewA实现中我设置了委托:
viewB.delegate = self;
Run Code Online (Sandbox Code Playgroud)
现在我可以从viewB调用doSomething到任何未知类型的委托.
[delegate doSomething];
Run Code Online (Sandbox Code Playgroud)
"C++如何编程"是一个更糟糕的读物,无法找到演示基本设计模式的简单例子.
我在C++中寻找的是:
任何允许A类,B类和C类知道ClassX didSomething()的东西!
谢谢
在过去的几天里,我读了很多关于"接口程序"和"控制反转"的内容.主要是在Java语言的上下文中.我的问题是它是否也是C++开发中的常见做法.有什么好处?有什么缺点?
是否值得申请小型项目(如15-20班)?
类A有一个类B的实例作为成员。有时B类的实例想和A类对话。在Objective-C中,我可以执行以下操作:
// A.h
@interface A : NSObject <BDelegate>
@property (nonatomic, retain) B *b;
@end
// A.m
- (void) classBsays {
}
// B.h
@protocol BDelegate
- (void) classBsays;
@end
@interface B : NSObject
@property (nonatomic, assign) id<BDelegate> delegate;
@end
// B.m
@implementation B
- (void) f {
[delegate classBsays];
}
@end
Run Code Online (Sandbox Code Playgroud)
我在C ++中使用类B上的void指针完成了类似的操作。但是,这漏掉了“类B的委托应实现此类方法”这一部分。
如何模仿C ++中的Objective-C协议?
可能重复:
如何在C++中声明接口?
有人问我一个问题:"在C++中没有像java这样的接口.但事件那么你可以在c ++中实现它们,你会怎么做?"
怎么样?我会用虚方法创建一个类.这看起来像java中的接口或?
谢谢
根据此答案,在C ++中从概念上类似于接口的方式声明类的方法如下:
class IDemo
{
public:
virtual ~IDemo() {}
virtual void OverrideMe() = 0;
};
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时,会收到警告:'IDemo' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit。是否有适当的方法在项目中使用此类接口而不用这些vtable污染每个翻译单元?
我想创建一个优先级队列类,我可以在不同的程序中一次又一次地重复使用,它只存储一个类型/类.
我可以通过使用compareTo方法阻止任何其他类型/类进入队列,但这意味着队列类应该在进入队列的所有类型/类中都需要compareTo方法.
我知道在Java中,您可以使类实现Comparable以确保该类实现compareTo方法.所以我想知道c ++中是否有类似的东西.
同样,我不能使用模板,所以,任何替代品将不胜感激.模板不受限制的原因我也不知道,要求这个程序的人不会对此有所了解.它也必须纯粹是我自己的优先级队列代码.
在C++中,我如何声明一个接口,我可以使用它,如下所示:
/** Enemy "Interface" */
Class Enemy {
Enemy();
virtual ~Enemy();
virtual void doStuff() = 0;
};
/** Enemy of type 1 */
Class Enemy_type1 : public Enemy {
Enemy_type1();
virtual ~Enemy_type1();
virtual void doStuff() {
// different for every type of enemy
}
};
/** Add an enemy to EnemyManager */
void EnemyManager::addEnemy(Enemy * e) {
this->enemies.push_back(*e); // declared as vector<Enemy> enemies;
}
Run Code Online (Sandbox Code Playgroud) c++ ×9
interface ×4
inheritance ×2
oop ×2
callback ×1
code-reuse ×1
delegates ×1
java ×1
objective-c ×1
performance ×1
polymorphism ×1
pure-virtual ×1
rust ×1