Virtual functions c++
Virtual functions c++
我尝试做一些练习,当我最终认为我理解时,它来了一个破坏一切的练习。例如,我有以下类:
class A
{
public:
A() {std::cout<<"A()";}
virtual ~A(){std::cout<<"~A()";}
virtual void print() {std::cout<<"A";}
};
class B : public A
{
public:
B() {std::cout<<"B()";}
virtual ~B(){std::cout<<"~B()";}
virtual void print() {std::cout<<"B";}
};
以及以下代码片段:
void f3()
{
A a[2];
a[1]=B();
a[1].print();
}
我认为结果是:
A() A()
A() B() {not sure why there is an A() too)
A - and here I really don't know because either A and B are virtual(and I have in the notebook A)
~B() ~A()
~A() ~A()
另一个代码片段:
void f4()
{
A* a[]={new A(), new B()};
a[0]->print();
a[1]->print();
delete a[0];
delete a[1];
}
这也是一个问题。我们有
A() {here I don t know why there is an A()}
A() B()
A
B
~B() ~A()
A()
但这是正确的吗?为什么这里有 A 和 B,而不是 B 和 A?我的意思是,在第一个练习中,当它是 B() 类型时,我有 A,这就是我认为这是正常的,但为什么?
A() A()
您创建了一个包含两个 A 的数组,因此调用了两个 A ctor。
A() B() {not sure why there is an A() too)
您创建了一个 B(B()
),并且 B 是从 A 派生的,因此步骤是:分配内存以存储 B,
A - and here I really don't know because either A and B are virtual(and I have in the notebook A)
您将新创建的 B 分配给 A,因此这会导致将 B 的 A 部分复制到目标 A。然后你在 A 上调用了print
,这打印A
.
~B() ~A()
~A() ~A()
DTOR 的调用方式与 CTORS 完全相反。
在第二次尝试中,您将使用指针和动态分配,在本例中,将使用多态性。数组是一个由两个指向类型 A 的指针组成的数组,使用两个对象的(地址)进行初始化:第一个对象以 A 开头,第二个对象以 B 开头。
当你调用 a[0]->print()
时,a[0]
是 A 的地址,因此调用它print
的方法。
当你调用 a[1]->print()
时,a[1]
是 B 的地址,所以调用它print
的方法,因为print
是virtual
的。
相关文章:
- 如何在Google Cloud Functions上运行C++文件?
- "thread-safe data"与"thread-safe code/functions"的区别
- 有没有办法扩展和调用 std::functions 的元组?
- C++ Functions & Arrays - Visual Studios 中的错误 C4700
- Protobuf 生成的C++类无法针对 iOS 进行编译,并显示错误"Only virtual member functions can be marked 'final'"
- StringCch* functions and Cstring
- Call std::functions
- "Default member initializer needed within definition of enclosing class outside of member functions
- TicTacToe C++ functions
- 创建带有任何参数的 std::functions 的unordered_map?
- 将lambdas/functions存储在std::vector中,而不使用std::function
- 如何让 CMake 编译包含 Boost Local Functions 的源文件
- "All arguments to functions are passed by value" C 中的,C++ 中对引用传递的混淆
- 犰狳/ Xcode:无处"functions that differ only in their return type cannot be overloaded"错误
- boost::bind with member functions(作为boost::asio异步写入处理程序)
- "functions"对话框过程中的过程
- "Only non-static member functions may be virtual"
- C++ "Virtual functions handling on multiple base classes"
- QML - Q_INVOKABLE functions
- "Cannot overload functions distinguished by return type alone"是什么意思?