【发布时间】:2019-03-01 06:32:36
【问题描述】:
我向你展示这个密码谜题:
使用这个编译器:
user@bruh:~/test$ g++ --version
g++ (Ubuntu 7.3.0-16ubuntu3) 7.3.0 版权所有 (C) 2017 Free Software Foundation, Inc. 这是免费软件;请参阅复制条件的来源。没有 保修单;甚至不是为了适销性或特定用途的适用性。
...这个编译字符串:
g++ main.cpp class.cpp -o main -g
...还有这些文件:
class.hpp:
class base {
public:
base();
virtual void f() = 0;
};
class derived : public base {
public:
derived( unsigned int id );
void f() override;
unsigned int id;
};
class.cpp:
#include <iostream>
#include "class.hpp"
base::base() {
return;
}
derived::derived( unsigned int id )
:
id( id ),
base() {
return;
}
void derived::f() {
std::cout << "Ahoy, Captain! I am " << id << std::endl;
return;
}
main.cpp:
#include <iostream>
#include <functional>
#include <vector>
#include "class.hpp"
int main() {
unsigned int n_elements;
std::cout << "enter the number of elements: ";
std::cin >> n_elements;
std::cout << std::endl;
std::vector< class derived > v;
std::vector< std::reference_wrapper< class base > > base_vector_0;
std::vector< std::reference_wrapper< class base > > base_vector_1;
for( unsigned int i = 0; i < n_elements; i++ ) {
v.emplace_back( i );
base_vector_0.emplace_back( v[ i ] );
}
for( unsigned int i = 0; i < n_elements; i++ ) {
base_vector_1.emplace_back( v[ i ] );
}
std::cout << "sanity check:" << std::endl;
for( unsigned int i = 0; i < n_elements; i++ ) {
class base &base = v[ i ];
base.f();
}
std::cout << "case 1:" << std::endl;
for( unsigned int i = 0; i < n_elements; i++ ) {
base_vector_1[ i ].get().f();
}
std::cout << "case 0:" << std::endl;
for( unsigned int i = 0; i < n_elements; i++ ) {
base_vector_0[ i ].get().f();
}
return 0;
}
...我得到以下输出:
user@bruh:~/test$ ./main
enter the number of elements: 1
sanity check:
Ahoy, Captain! I am 0
case 1:
Ahoy, Captain! I am 0
case 0:
Ahoy, Captain! I am 0
harrynh3@bruh:~/test$ ./main
enter the number of elements: 2
sanity check:
Ahoy, Captain! I am 0
Ahoy, Captain! I am 1
case 1:
Ahoy, Captain! I am 0
Ahoy, Captain! I am 1
case 0:
Segmentation fault (core dumped)
我的问题:
当用户提供的参数 = 1 时,为什么这不是段错误?
当用户提供的参数 > 1 时,为什么会出现 segfault?
我对代码作用的简短解释:
创建许多从抽象基类派生的对象。将容器中对象的引用存储为围绕抽象基类引用的 std::reference_wrapper。创建 std::reference_wrapper 的容器略有不同。通过 std::reference_wrappers 调用纯虚函数的派生覆盖。 Segfaults 特别是在上面源代码中表示的情况下。
我恳求 C++ 专家...请帮助我!这很有趣,我不知道为什么会这样!我可能做了一些愚蠢的事情。
【问题讨论】:
标签: c++ c++11 std reference-wrapper run-time-polymorphism