我在C ++个人学习过程中遇到了困难。我来自Java语言。
我正在尝试在C ++中设置一个具有抽象方法的类。到那里,没有什么大不了的。但我想像在Java中那样实例化该类:
var bar = o[id];
在Java中,它完美运行。但是我想在C ++中做同样的事情,这里存在一个问题:C ++似乎并不喜欢实例化具有虚方法的类的想法。
我已经搜索了几天了,我无法在互联网上找到该问题的任何答案。也许只是我写错了搜索句子,因为我不是英语母语人士,在提出问题时我可能会遇到一些困难找到正确的语法。
在C ++中,我是否有可能像在Java中一样,或者至少可能?使用模板是解决方案吗? (之前从未学过模板,我还有很多需要学习的东西)。
此外,我无法创建多个类来重新定义方法,因为此类将用于为每个实例执行自定义处理。我认为,创建课程只是为了让它成为这种类型中唯一一个对象的骄傲之父。
答案 0 :(得分:6)
我想说 - 在c ++中,相当于你的java代码:
#include <iostream>
struct A {
virtual void foo() = 0;
};
int main(void) {
struct B : public A {
void foo() override {
std::cout << "inst::foo()" << std::endl;
}
};
A* p = new B;
p->foo();
}
正如您所看到的,没有实例化抽象类的东西,您必须提供实例化的具体实现。微妙的区别是在java中它是一个匿名类,这里不是......
答案 1 :(得分:2)
这不是您示例中MyClass
的实例化!您只需使用anonymous inner-class
扩展它,然后通过此代码和语法实例化它的实例(类不是匿名的,但是 - 它的名称类似于YourClass$1
)。
然后你可以将这个匿名YourClass$1
类实例的引用放到MyClass
变量中,因为它是一个超类(你可以使用Object
或某些接口类型)< / p>
C ++ 11 没有完全相同类型的内部类和扩展/实例化语法,但您可以尝试使用Lambdas来实现类似的结果。看这里:Does C++0x support Anonymous Inner Classes?
答案 2 :(得分:0)
与c ++不同,Java区分接口和抽象类,这可能是您混淆的源头。
这是Java接口在c ++中的外观:
class myClass{
virtual void foo =0; //pure virtual method
}
这是c ++中的Java抽象类:
class myClass{
virtual void foo=0;
virtual void abstractMethod();
}
这些都不能实例化,你只能从它们继承并覆盖抽象方法。
class myClass_Impl: public myClass
{
void foo();//must provide an implementation for pure virtual methods
void abstractMethod(); //override the abstract class method
}
main()
{
myClass_Impl x; //instace of your class
myClass * p = new myClass_Impl(); //using polymorphism
}
答案 3 :(得分:0)
语法略有不同。但是你可以返回本地类的实例:
class MyAbstractClass {
public:
virtual void my_method() = 0;
};
MyAbstractClass* some_function() {
class MyConcreteClass : public MyAbstractClass { // Our local class definition.
public:
virtual void my_method() override {
// some code
}
};
return new MyConcreteClass(); // Return a pointer to an instance of it
}