- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有:
class BASE{
public:
virtual void func1() = 0;
};
然后我有一些派生类,比如:
class Derived1 : public BASE{
public:
void func1() {...implementation....}
};
class Derived2 : public BASE{
public:
void func1() {...implementation....}
};
主要我想做类似的事情(伪代码):
if ( cond ){
BASE b := new Derived1
}
else{
BASE b := new Derived2
}
b.func1();
因此调用的 func1() 函数是专用于派生类的函数。
我尝试过:
BASE b = new Derived1();
但是编译器会报错。
在 C++ 中可以这样做吗?怎么办?
最佳答案
显然,您已经习惯了垃圾回收 OO 语言,例如 Java。要很好地回答这个问题,从这个角度来看可能是好的。
当你写东西的时候
Base b = new Derived1();
在 Java 中,会发生以下情况:
&b
的指针“β
”(我称之为 Base
)对象分配在栈上Derived1
对象(我称之为 d
)分配在堆上β
设置为指向 Derived
对象。您在 Java 中如此轻松地摆脱困境的原因是有一个垃圾收集器。只要β
,这就不会生效。在堆栈上并指向 d
, 因为 GC 知道 d
仍然可以访问并且可能正在使用中。但是一旦没有指针指向 d
不再(例如,因为你声明 b
的函数离开了作用域),GC 被允许释放 d
占用的空间。 .很简单,但是垃圾回收有 several disadvantages ,这是我们在 C++ 中不想要的。
所以在 C++ 中,如果你做类似的事情
Base* b = new Derived1();
直接对应Java版本,你有问题:当b
离开范围,没有任何内容涉及 d
了,但是它仍然在堆上!。需要自己删除
delete b;
(请注意,这有一个很大的优势,您可以准确地确定它在哪一点被删除,而垃圾收集器可能会将它无用地放置很长时间,并且只有在您开始耗尽内存时才将其删除)。但再一次,这还不够:与垃圾收集器不同,您的程序不会自动知道 b
。指向 Derived1
对象而不是 Base
对象,所以 delete
will delete 认为它正在处理 Base
.但是很容易理解这一点:在 Base
中包含一个虚拟析构函数类,比如
class Base{
public:
virtual void func1() = 0;
virtual ~Base() {}
};
现在,需要手动删除所有内容显然有点危险:如果您忘记这样做,就会发生内存泄漏,即对象永远不会从堆中删除只要你的程序运行。出于这个原因,应该使用智能指针 而不是普通的 C 风格指针,这会在离开作用域时自动删除它们指向的对象。在 C++11 中,它们在标准库(头文件 <memory>
)中定义。你只要做
std::unique_ptr<Base> b(new Derived1());
现在,当b
叶范围,Derived1
对象被自动删除。
在所有这些例子中,调用虚函数的方式都是一样的:
b->func1();
关于c++ - 使用类作为 BaseClass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10470460/
在我的游戏中,我有一个 Loot 基类,它具有对任何可以被玩家捡起并存储在他的元素栏中的东西通用的方法。这将包括药水、设备、弹药等。我可以装备箭,但不能装备药水。所以 Arrow 将是 Ammo 的一
有 class BaseClass implements IData (); class ChildClassA() extends BaseClass; class ChildClassB() ex
例如,在 vanilla JS 中我可以轻松地执行以下操作: class BaseClass extends React.Component { ... } class Foo extends Bas
我正在自动化一个由多个独立应用程序组成的环境。在某些时候,我决定将每个应用程序定义为一个类并将其保存为单独的文件是最有意义的。 我现在拥有的: 包含 *py 文件的目录,其中每个文件为单个应用程序定义
我有一个基类和许多子类。在每个子类中,我都使用对象 A - 因此我将它放在基类中。在一半的子类中,我使用对象 B,因此我没有将 B 放在基类中。我希望我的基类包含尽可能多的功能,因此如果定义了对象 B
我有: class BASE{ public: virtual void func1() = 0; }; 然后我有一些派生类,比如: class Derived1 : public BASE{
(抱歉标题模糊) 我有一个带有各种派生类 D1、D2 等的基类 B。 另外还有一个模板 template Storage; 现在每个派生类都有不同版本的存储类 class D1 : public c
请考虑以下类别: public interface BaseInterface { void method1(); void method2(); void method3()
我无法在具有 2 个输入引脚的 BaseClasses 中找到合适的渲染器类 - 一个用于视频,一个用于音频。有人可以推荐/提供一些代码吗? 问候多米尼克 最佳答案 CBaseRenderer cla
我正在学习一门新的 C++ 语言,其中使用了 Java 中使用的知识 not JavaScript .我正在尝试创建一个名为 Command 的父类派生类 CmdHelp .在 Java 中我会制作一
基本上我有一个名为 Asset 的类,它包含我系统中某个 Asset 的所有信息。这可能会变得相当大( Assets 有缩略图、文件名、元数据、评级、评论等)。 在我的结果页面上,我列出了所有符合特定
我正在尝试创建一个简单的元素“ list ”,就像在任何角色扮演游戏中一样。我制作了非常基本的类,它们具有属性。 无论如何,我有一个基类 item从那里继承的是weapon . item具有也在 we
我即将为我的 Razor 组件创建一个基类。 这个 Base-Class 看起来像: public abstract class ExampleBase : ComponentBase { p
我正在开发一款可以追溯到很久以前的软件产品。我们源代码的一部分是构建基类的项目。据推测,这是一个随 Windows SDK 一起提供的项目,用于开发引用 DirectShow 的应用程序。 不幸的是,
Internet 上有很多关于在覆盖 Equals 时如何覆盖 GetHashCode() 的信息。但是,所有这些示例都是关于包含一些可以生成哈希的字段的类。我试图找到的是一个很好的 GetHashC
我有很多类都继承自一个基类——实际上它只是一个允许序列化的接口(interface)包装器: public abstract class VoucherRuleBase : IRule{ pu
我的 java 程序中有一系列类,如下所示: src | |- BaseCost |- com.jdoe.nationalcosts |- EntryTicketCost |- Fli
编辑:这是我的错,因为还有另一个 Foo潜伏的定义让我对Foo<>感到困惑定义。 在下面的代码中,Foo是 Bar 的基类对吧? 那为什么编译器会在 .BaseType 下划线呢?部分并说“给定的表达
我有一个名为 GLObject 的基类,具有以下 header : class GLObject{ public: GLObject(float width = 0.0, fl
命名基类的推荐方法是什么?是在类型名称前加上“Base”或“Abstract”还是我们只在其后缀“Base”? 考虑以下几点: 类型:ViewModel 例如MainViewModel、ReportV
我是一名优秀的程序员,十分优秀!